mirror of
https://github.com/zyedidia/micro.git
synced 2024-08-18 00:10:32 +03:00
Compare commits
14 Commits
572fe928ec
...
0b473cdf10
Author | SHA1 | Date | |
---|---|---|---|
|
0b473cdf10 | ||
|
dc7759204b | ||
|
a84aa225ab | ||
|
882b98f3f1 | ||
|
0fa4a3a8db | ||
|
531c7d88e2 | ||
|
c58ed0e51a | ||
|
f475220e67 | ||
|
57375e0732 | ||
|
d98fafd2f9 | ||
|
f5a9744bde | ||
|
f05d3582b3 | ||
|
26ae1b95cc | ||
|
9e808832f1 |
6
.github/workflows/nightly.yaml
vendored
6
.github/workflows/nightly.yaml
vendored
@ -1,7 +1,8 @@
|
|||||||
name: Nightly builds
|
name: Nightly builds
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch: # Allows manual trigger
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 0 * * *'
|
- cron: '0 0 * * *'
|
||||||
jobs:
|
jobs:
|
||||||
nightly:
|
nightly:
|
||||||
strategy:
|
strategy:
|
||||||
@ -14,11 +15,14 @@ jobs:
|
|||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go-version }}
|
go-version: ${{ matrix.go-version }}
|
||||||
|
cache: false
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: master
|
ref: master
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: tools/cross-compile.sh
|
run: tools/cross-compile.sh
|
||||||
|
9
.github/workflows/test.yaml
vendored
9
.github/workflows/test.yaml
vendored
@ -8,10 +8,15 @@ jobs:
|
|||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go-version }}
|
go-version: ${{ matrix.go-version }}
|
||||||
- uses: actions/checkout@v3
|
cache: false
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
@ -156,7 +156,7 @@ for other operating systems. These packages are not guaranteed to be up-to-date.
|
|||||||
* `choco install micro`.
|
* `choco install micro`.
|
||||||
* `scoop install micro`.
|
* `scoop install micro`.
|
||||||
* OpenBSD: Available in the ports tree and also available as a binary package.
|
* OpenBSD: Available in the ports tree and also available as a binary package.
|
||||||
* `pkd_add -v micro`.
|
* `pkg_add -v micro`.
|
||||||
* NetBSD, macOS, Linux, Illumos, etc. with [pkgsrc](http://www.pkgsrc.org/)-current:
|
* NetBSD, macOS, Linux, Illumos, etc. with [pkgsrc](http://www.pkgsrc.org/)-current:
|
||||||
* `pkg_add micro`
|
* `pkg_add micro`
|
||||||
* macOS: Available in package managers.
|
* macOS: Available in package managers.
|
||||||
|
@ -40,8 +40,7 @@ var (
|
|||||||
flagClean = flag.Bool("clean", false, "Clean configuration directory")
|
flagClean = flag.Bool("clean", false, "Clean configuration directory")
|
||||||
optionFlags map[string]*string
|
optionFlags map[string]*string
|
||||||
|
|
||||||
sigterm chan os.Signal
|
sighup chan os.Signal
|
||||||
sighup chan os.Signal
|
|
||||||
|
|
||||||
timerChan chan func()
|
timerChan chan func()
|
||||||
)
|
)
|
||||||
@ -360,9 +359,9 @@ func main() {
|
|||||||
|
|
||||||
screen.Events = make(chan tcell.Event)
|
screen.Events = make(chan tcell.Event)
|
||||||
|
|
||||||
sigterm = make(chan os.Signal, 1)
|
util.Sigterm = make(chan os.Signal, 1)
|
||||||
sighup = make(chan os.Signal, 1)
|
sighup = make(chan os.Signal, 1)
|
||||||
signal.Notify(sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT)
|
signal.Notify(util.Sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT)
|
||||||
signal.Notify(sighup, syscall.SIGHUP)
|
signal.Notify(sighup, syscall.SIGHUP)
|
||||||
|
|
||||||
timerChan = make(chan func())
|
timerChan = make(chan func())
|
||||||
@ -437,7 +436,7 @@ func DoEvent() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
case <-sigterm:
|
case <-util.Sigterm:
|
||||||
for _, b := range buffer.OpenBuffers {
|
for _, b := range buffer.OpenBuffers {
|
||||||
if !b.Modified() {
|
if !b.Modified() {
|
||||||
b.Fini()
|
b.Fini()
|
||||||
|
@ -209,16 +209,28 @@ func (t *TermPane) CommandMode() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NextSplit moves to the next split
|
// NextSplit changes the view to the next split
|
||||||
func (t *TermPane) NextSplit() {
|
func (t *TermPane) NextSplit() {
|
||||||
a := t.tab.active
|
a := Tabs.List[Tabs.Active()]
|
||||||
if a < len(t.tab.Panes)-1 {
|
a.SetActive((a.active + 1) % len(a.Panes))
|
||||||
a++
|
}
|
||||||
} else {
|
|
||||||
a = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
t.tab.SetActive(a)
|
// PreviousSplit changes the view to the previous split
|
||||||
|
func (t *TermPane) PreviousSplit() {
|
||||||
|
a := Tabs.List[Tabs.Active()]
|
||||||
|
panesLen := len(a.Panes)
|
||||||
|
a.SetActive((a.active + panesLen - 1) % panesLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PreviousTab switches to the previous tab in the tab list
|
||||||
|
func (t *TermPane) PreviousTab() {
|
||||||
|
tabsLen := len(Tabs.List)
|
||||||
|
Tabs.SetActive((Tabs.Active() + tabsLen - 1) % tabsLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NextTab switches to the next tab in the tab list
|
||||||
|
func (t *TermPane) NextTab() {
|
||||||
|
Tabs.SetActive((Tabs.Active() + 1) % len(Tabs.List))
|
||||||
}
|
}
|
||||||
|
|
||||||
// HandleCommand handles a command for the term pane
|
// HandleCommand handles a command for the term pane
|
||||||
@ -228,7 +240,10 @@ func (t *TermPane) HandleCommand(input string) {
|
|||||||
|
|
||||||
// TermKeyActions contains the list of all possible key actions the termpane could execute
|
// TermKeyActions contains the list of all possible key actions the termpane could execute
|
||||||
var TermKeyActions = map[string]TermKeyAction{
|
var TermKeyActions = map[string]TermKeyAction{
|
||||||
"Exit": (*TermPane).Exit,
|
"Exit": (*TermPane).Exit,
|
||||||
"CommandMode": (*TermPane).CommandMode,
|
"CommandMode": (*TermPane).CommandMode,
|
||||||
"NextSplit": (*TermPane).NextSplit,
|
"NextSplit": (*TermPane).NextSplit,
|
||||||
|
"PreviousSplit": (*TermPane).PreviousSplit,
|
||||||
|
"NextTab": (*TermPane).NextTab,
|
||||||
|
"PreviousTab": (*TermPane).PreviousTab,
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
shellquote "github.com/kballard/go-shellquote"
|
shellquote "github.com/kballard/go-shellquote"
|
||||||
"github.com/zyedidia/micro/v2/internal/screen"
|
"github.com/zyedidia/micro/v2/internal/screen"
|
||||||
|
"github.com/zyedidia/micro/v2/internal/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ExecCommand executes a command using exec
|
// ExecCommand executes a command using exec
|
||||||
@ -95,28 +96,30 @@ func RunInteractiveShell(input string, wait bool, getOutput bool) (string, error
|
|||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
|
||||||
// This is a trap for Ctrl-C so that it doesn't kill micro
|
// This is a trap for Ctrl-C so that it doesn't kill micro
|
||||||
// Instead we trap Ctrl-C to kill the program we're running
|
// micro is killed if the signal is ignored only on Windows, so it is
|
||||||
|
// received
|
||||||
c := make(chan os.Signal, 1)
|
c := make(chan os.Signal, 1)
|
||||||
|
signal.Reset(os.Interrupt)
|
||||||
signal.Notify(c, os.Interrupt)
|
signal.Notify(c, os.Interrupt)
|
||||||
go func() {
|
err = cmd.Start()
|
||||||
for range c {
|
if err == nil {
|
||||||
cmd.Process.Kill()
|
err = cmd.Wait()
|
||||||
|
if wait {
|
||||||
|
// This is just so we don't return right away and let the user press enter to return
|
||||||
|
screen.TermMessage("")
|
||||||
}
|
}
|
||||||
}()
|
} else {
|
||||||
|
screen.TermMessage(err)
|
||||||
cmd.Start()
|
}
|
||||||
err = cmd.Wait()
|
|
||||||
|
|
||||||
output := outputBytes.String()
|
output := outputBytes.String()
|
||||||
|
|
||||||
if wait {
|
|
||||||
// This is just so we don't return right away and let the user press enter to return
|
|
||||||
screen.TermMessage("")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the screen back up
|
// Start the screen back up
|
||||||
screen.TempStart(screenb)
|
screen.TempStart(screenb)
|
||||||
|
|
||||||
|
signal.Notify(util.Sigterm, os.Interrupt)
|
||||||
|
signal.Stop(c)
|
||||||
|
|
||||||
return output, err
|
return output, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,8 @@ var (
|
|||||||
|
|
||||||
// Stdout is a buffer that is written to stdout when micro closes
|
// Stdout is a buffer that is written to stdout when micro closes
|
||||||
Stdout *bytes.Buffer
|
Stdout *bytes.Buffer
|
||||||
|
// Sigterm is a channel where micro exits when written
|
||||||
|
Sigterm chan os.Signal
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -4,6 +4,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -19,13 +20,17 @@ func getTag(match ...string) (string, *semver.PRVersion) {
|
|||||||
} else {
|
} else {
|
||||||
tagParts := strings.Split(string(tag), "-")
|
tagParts := strings.Split(string(tag), "-")
|
||||||
if len(tagParts) == 3 {
|
if len(tagParts) == 3 {
|
||||||
if ahead, err := semver.NewPRVersion(tagParts[1]); err == nil {
|
ahead, err := semver.NewPRVersion(tagParts[1])
|
||||||
|
if err == nil {
|
||||||
return tagParts[0], &ahead
|
return tagParts[0], &ahead
|
||||||
}
|
}
|
||||||
|
log.Printf("semver.NewPRVersion(%s): %v", tagParts[1], err)
|
||||||
} else if len(tagParts) == 4 {
|
} else if len(tagParts) == 4 {
|
||||||
if ahead, err := semver.NewPRVersion(tagParts[2]); err == nil {
|
ahead, err := semver.NewPRVersion(tagParts[2])
|
||||||
|
if err == nil {
|
||||||
return tagParts[0] + "-" + tagParts[1], &ahead
|
return tagParts[0] + "-" + tagParts[1], &ahead
|
||||||
}
|
}
|
||||||
|
log.Printf("semver.NewPRVersion(%s): %v", tagParts[2], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return string(tag), nil
|
return string(tag), nil
|
||||||
@ -33,15 +38,12 @@ func getTag(match ...string) (string, *semver.PRVersion) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if tags, err := exec.Command("git", "tag").Output(); err != nil || len(tags) == 0 {
|
|
||||||
// no tags found -- fetch them
|
|
||||||
exec.Command("git", "fetch", "--tags").Run()
|
|
||||||
}
|
|
||||||
// Find the last vX.X.X Tag and get how many builds we are ahead of it.
|
// Find the last vX.X.X Tag and get how many builds we are ahead of it.
|
||||||
versionStr, ahead := getTag("--match", "v*")
|
versionStr, ahead := getTag("--match", "v*")
|
||||||
version, err := semver.ParseTolerant(versionStr)
|
version, err := semver.ParseTolerant(versionStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// no version tag found so just return what ever we can find.
|
// no version tag found so just return what ever we can find.
|
||||||
|
log.Printf("semver.ParseTolerant(%s): %v", versionStr, err)
|
||||||
fmt.Println("0.0.0-unknown")
|
fmt.Println("0.0.0-unknown")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -66,6 +68,8 @@ func main() {
|
|||||||
if pr, err := semver.NewPRVersion(tag); err == nil {
|
if pr, err := semver.NewPRVersion(tag); err == nil {
|
||||||
// append the tag as pre-release name
|
// append the tag as pre-release name
|
||||||
version.Pre = append(version.Pre, pr)
|
version.Pre = append(version.Pre, pr)
|
||||||
|
} else {
|
||||||
|
log.Printf("semver.NewPRVersion(%s): %v", tag, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ahead != nil {
|
if ahead != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user