Недавно я познакомился с редактором кода Zed и заинтересовался им настолько, что решил перейти на него. Когда на днях вышла стабильная версия для Linux, я осознал, что пора действовать. К моему большому сожалению, в большинстве пакетных менеджеров Linux доступна более старая версия Zed, чем та, что представлена на официальном сайте, поэтому приходится обновлять приложение вручную. Так возникла идея создать программу, которая автоматически обновляла бы Zed за меня. Для этого я решил использовать язык программирования Golang.

Проверка текущей версии

Проверить версию редактора можно командой zed --version .

Вывод команды
Вывод команды

Эту команду нужно запустить во время выполнения нашей программы. Я создал глобальную переменную availableVersion, в которой будет храниться текущая версия программы, и функцию, которая принимает команду и ее аргументы, затем из вывода извлекает версию и записывает в переменную availableVersion. После этого можно использовать переменную availableVersion для сравнения текущей версии программы с последней доступной версией.

var availableVersion string = ""
func execute(cmd string, arg ...string) {

	out, err := exec.Command(cmd, arg[0]).Output()

	if err != nil {
		panic(err)
	}
	output := string(out[:])

	availableVersion = getVersionFromString(output, 4)
}

Функция getVersionFromString принимает строку и индекс элемента, с которого начинается обработка, и возвращает минорную версию.

func getVersionFromString(target string, start int) string {
	var version string = ""
	for i, c := start, 0; i < len(target); i++ {
		if target[i] == '.' {
			c++
		}
		if c < 2 {
			version += string(target[i])
		}
	}
	return version
}

Получение актуальной версии

Для того что бы проверить актуальную вышедшую версию, я сверяюсь с версией релиза на Github. Проверить последнюю релизную версию можно по ссылке такого типа https://api.github.com/repos/owner/repo/releases/latest.

Затем я создал еще одну глобальную переменную targetVersion, в которой должна хранится актуальная версия, и функцию getActualVersion, которая получает json с актуальной версией, извлекает ее и записывет в переменную.

var targetVersion string = ""
func getActualVersion() {
	resp, err := http.Get("https://api.github.com/repos/zed-industries/zed/releases/latest")

	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, err := io.ReadAll(resp.Body)
  
	rm := make(map[string]json.RawMessage)

	err = json.Unmarshal(body, &rm)

	if err != nil {
		panic(err)
	}

	targetVersion = getVersionFromString(string(rm["tag_name"]), 2)
}

Сравнение версий

Осталось только сравнить версии, и если они не совпадают, запустить скрипт установки/обновления с оффициального сайта.

func main() {
	execute("zed", "--version")
	getActualVersion()

	if availableVersion != targetVersion {
		execute("curl https://zed.dev/install.sh | sh")
		fmt.Println("\n\n\nSuccessfully update")
	} else {
		fmt.Println("The versions match")
	}
}

Добавление в crontab

Для того, чтобы все было полностью автоматизировано, программу нужно скомпилировать go build main.go и добавить исполняемый файл в crontab.

Итог

Я написал простой скрипт на Go, который раз в неделю проверяет обновления редактора кода Zed и если они есть, то устанавливает их. Посмотреть полный код можно на моем Github. Надеюсь, статья была полезной. Всем добра!

Комментарии (3)


  1. ret77876
    21.07.2024 09:29

    Может быть стоит интегрировать автообновление в сам Zed, а то отдельный скрипт не очень удобен.


    1. xnike
      21.07.2024 09:29

      Вот да, под маком он сам умеет проверять на наличие обновлений и выполнять обновление.

      Возможно просто не допилили этот фунционал для остальных операционных систем.


    1. Revertis
      21.07.2024 09:29
      +1

      И вообще, редактор написан на Расте, а обновляют на Го, какого фига?