From 21d2bd0a3bebcec2cf6adab854d96196f59463ce Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 22 Aug 2022 15:04:00 +0200 Subject: update --- swift/boot/loader/entries/arch.conf | 5 +++++ swift/boot/loader/entries/arch2.conf | 7 +++++++ swift/boot/loader/loader.conf | 3 +++ swift/etc/X11/xorg.conf.d/10-input.conf | 6 ++++++ swift/etc/X11/xorg.conf.d/10-keyboard.conf | 6 ++++++ swift/etc/X11/xorg.conf.d/20-intel.conf | 4 ++++ swift/etc/fstab | 14 ++++++++++++++ swift/etc/qemu/bridge.conf | 1 + swift/etc/systemd/network/20-wired.network | 8 ++++++++ swift/etc/systemd/network/25-wireless.network | 8 ++++++++ swift/etc/systemd/network/bind.network | 5 +++++ swift/etc/systemd/network/bridge.netdev | 4 ++++ swift/etc/systemd/network/bridge.network | 5 +++++ swift/etc/systemd/resolved.conf | 3 +++ 14 files changed, 79 insertions(+) create mode 100755 swift/boot/loader/entries/arch.conf create mode 100755 swift/boot/loader/entries/arch2.conf create mode 100755 swift/boot/loader/loader.conf create mode 100644 swift/etc/X11/xorg.conf.d/10-input.conf create mode 100644 swift/etc/X11/xorg.conf.d/10-keyboard.conf create mode 100644 swift/etc/X11/xorg.conf.d/20-intel.conf create mode 100644 swift/etc/fstab create mode 100644 swift/etc/qemu/bridge.conf create mode 100644 swift/etc/systemd/network/20-wired.network create mode 100644 swift/etc/systemd/network/25-wireless.network create mode 100644 swift/etc/systemd/network/bind.network create mode 100644 swift/etc/systemd/network/bridge.netdev create mode 100644 swift/etc/systemd/network/bridge.network create mode 100644 swift/etc/systemd/resolved.conf (limited to 'swift') diff --git a/swift/boot/loader/entries/arch.conf b/swift/boot/loader/entries/arch.conf new file mode 100755 index 0000000..5392c64 --- /dev/null +++ b/swift/boot/loader/entries/arch.conf @@ -0,0 +1,5 @@ +title Yoda Arch Linux +linux /vmlinuz-linux +initrd /intel-ucode.img +initrd /initramfs-linux.img +options root=/dev/disk/by-uuid/8c89d665-a17b-47da-aa19-4c855f134d54 net.ifnames=0 rw acpi_osi=Linux acpi_backlight=video diff --git a/swift/boot/loader/entries/arch2.conf b/swift/boot/loader/entries/arch2.conf new file mode 100755 index 0000000..69d70b6 --- /dev/null +++ b/swift/boot/loader/entries/arch2.conf @@ -0,0 +1,7 @@ +title Yoda2 Arch Linux +linux /vmlinuz-linux +initrd /intel-ucode.img +initrd /initramfs-linux.img +#options root=/dev/disk/by-uuid/8c89d665-a17b-47da-aa19-4c855f134d54 net.ifnames=0 rw acpi_osi=Linux acpi_backlight=video +options root=/dev/disk/by-uuid/fd0bd5d9-abfd-46e2-bbec-cc5042c19507 net.ifnames=0 rw acpi_osi=Linux acpi_backlight=video +#options root=/dev/disk/by-uuid/fd0bd5d9-abfd-46e2-bbec-cc5042c19507 net.ifnames=0 rw acpi_osi=Linux acpi_backlight=video snd_sof_intel_hda_common.hda_model=alc255-acer diff --git a/swift/boot/loader/loader.conf b/swift/boot/loader/loader.conf new file mode 100755 index 0000000..340ea34 --- /dev/null +++ b/swift/boot/loader/loader.conf @@ -0,0 +1,3 @@ +default arch2 +timeout 4 +console-mode max diff --git a/swift/etc/X11/xorg.conf.d/10-input.conf b/swift/etc/X11/xorg.conf.d/10-input.conf new file mode 100644 index 0000000..d719095 --- /dev/null +++ b/swift/etc/X11/xorg.conf.d/10-input.conf @@ -0,0 +1,6 @@ +Section "InputClass" + Identifier "HP 3 button mouse" + Driver "libinput" + Option "ScrollMethod" "button" + Option "ScrollButton" "2" +EndSection diff --git a/swift/etc/X11/xorg.conf.d/10-keyboard.conf b/swift/etc/X11/xorg.conf.d/10-keyboard.conf new file mode 100644 index 0000000..131f8f3 --- /dev/null +++ b/swift/etc/X11/xorg.conf.d/10-keyboard.conf @@ -0,0 +1,6 @@ +Section "InputClass" + Identifier "Keyboard Defaults" + MatchIsKeyboard "yes" + Option "XkbLayout" "fr" + Option "XkbOptions" "caps:super,altwin:menu_win" +EndSection diff --git a/swift/etc/X11/xorg.conf.d/20-intel.conf b/swift/etc/X11/xorg.conf.d/20-intel.conf new file mode 100644 index 0000000..28e460c --- /dev/null +++ b/swift/etc/X11/xorg.conf.d/20-intel.conf @@ -0,0 +1,4 @@ +Section "ServerLayout" + Identifier "Main" + Option "Xinerama" "0" +EndSection diff --git a/swift/etc/fstab b/swift/etc/fstab new file mode 100644 index 0000000..00d3167 --- /dev/null +++ b/swift/etc/fstab @@ -0,0 +1,14 @@ +# /dev/nvme1n1p5 +UUID=fd0bd5d9-abfd-46e2-bbec-cc5042c19507 / xfs rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 1 + +# /dev/nvme1n1p1 +UUID=120F-B472 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2 + +# /dev/nvme1n1p3 +UUID=E23C1C4C3C1C1DDB /mnt/windows ntfs-3g gid=1000,uid=1000,dmask=022,fmask=133,noauto 0 0 + +# /dev/nvme0n1p1 +UUID=8c89d665-a17b-47da-aa19-4c855f134d54 /data xfs rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 2 + +# Sony walkman NW-A55L external flash +/dev/sdb1 /mnt/sdb1 exfat noauto,gid=20,uid=501,dmask=002,fmask=113 0 0 diff --git a/swift/etc/qemu/bridge.conf b/swift/etc/qemu/bridge.conf new file mode 100644 index 0000000..a573665 --- /dev/null +++ b/swift/etc/qemu/bridge.conf @@ -0,0 +1 @@ +allow virbr0 diff --git a/swift/etc/systemd/network/20-wired.network b/swift/etc/systemd/network/20-wired.network new file mode 100644 index 0000000..9ac4295 --- /dev/null +++ b/swift/etc/systemd/network/20-wired.network @@ -0,0 +1,8 @@ +[Match] +Name=e* + +[Network] +DHCP=ipv4 + +[DHCP] +RouteMetric=10 diff --git a/swift/etc/systemd/network/25-wireless.network b/swift/etc/systemd/network/25-wireless.network new file mode 100644 index 0000000..3bb9c39 --- /dev/null +++ b/swift/etc/systemd/network/25-wireless.network @@ -0,0 +1,8 @@ +[Match] +Name=wl* + +[Network] +DHCP=ipv4 + +[DHCP] +RouteMetric=20 diff --git a/swift/etc/systemd/network/bind.network b/swift/etc/systemd/network/bind.network new file mode 100644 index 0000000..c0313fe --- /dev/null +++ b/swift/etc/systemd/network/bind.network @@ -0,0 +1,5 @@ +[Match] +Name=wl* + +[Network] +Bridge=br0 diff --git a/swift/etc/systemd/network/bridge.netdev b/swift/etc/systemd/network/bridge.netdev new file mode 100644 index 0000000..fe9c2ad --- /dev/null +++ b/swift/etc/systemd/network/bridge.netdev @@ -0,0 +1,4 @@ +[NetDev] +Name=br0 +Kind=bridge +MACAddress=3c:f0:11:73:77:51 diff --git a/swift/etc/systemd/network/bridge.network b/swift/etc/systemd/network/bridge.network new file mode 100644 index 0000000..684ce83 --- /dev/null +++ b/swift/etc/systemd/network/bridge.network @@ -0,0 +1,5 @@ +[Match] +Name=br0 + +[Network] +Address=10.0.2.1/24 diff --git a/swift/etc/systemd/resolved.conf b/swift/etc/systemd/resolved.conf new file mode 100644 index 0000000..186c2ec --- /dev/null +++ b/swift/etc/systemd/resolved.conf @@ -0,0 +1,3 @@ +[Resolve] +DNSSEC=no +DNSOverTLS=no -- cgit v1.3 From 56c37d482ac00e003690605ff3d50fb0528322c5 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 22 Aug 2022 16:18:05 +0200 Subject: update --- swift/etc/X11/xorg.conf.d/10-input.conf | 1 + 1 file changed, 1 insertion(+) (limited to 'swift') diff --git a/swift/etc/X11/xorg.conf.d/10-input.conf b/swift/etc/X11/xorg.conf.d/10-input.conf index d719095..ae48884 100644 --- a/swift/etc/X11/xorg.conf.d/10-input.conf +++ b/swift/etc/X11/xorg.conf.d/10-input.conf @@ -3,4 +3,5 @@ Section "InputClass" Driver "libinput" Option "ScrollMethod" "button" Option "ScrollButton" "2" + Option "NaturalScrolling" "on" EndSection -- cgit v1.3 From 55b6de7eb5ad16ddcd293cb2d717d327c5c15e77 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 25 Aug 2022 09:00:13 +0200 Subject: update --- swift/etc/udev/rules.d/95-hdmi-plug.rules | 5 +++++ swift/etc/udev/rules.d/hdmi.rules | 1 + 2 files changed, 6 insertions(+) create mode 100644 swift/etc/udev/rules.d/95-hdmi-plug.rules create mode 100644 swift/etc/udev/rules.d/hdmi.rules (limited to 'swift') diff --git a/swift/etc/udev/rules.d/95-hdmi-plug.rules b/swift/etc/udev/rules.d/95-hdmi-plug.rules new file mode 100644 index 0000000..465eada --- /dev/null +++ b/swift/etc/udev/rules.d/95-hdmi-plug.rules @@ -0,0 +1,5 @@ +ACTION=="change", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/marc/.Xauthority", RUN+="/home/marc/bin/hdmi" + +ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="25a4", ATTRS{idProduct}=="9311", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/marc/.Xauthority", RUN+="/home/marc/bin/hdmi" + +ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{idVendor}=="25a4", ATTRS{idProduct}=="9311", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/marc/.Xauthority", RUN+="/home/marc/bin/hdmi" diff --git a/swift/etc/udev/rules.d/hdmi.rules b/swift/etc/udev/rules.d/hdmi.rules new file mode 100644 index 0000000..ec06147 --- /dev/null +++ b/swift/etc/udev/rules.d/hdmi.rules @@ -0,0 +1 @@ +KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/marc/.Xauthority", RUN+="/home/marc/bin/hdmi" -- cgit v1.3 From bbe7b2670d2900dfdd260447b5d79eead21427d7 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 25 Aug 2022 17:41:44 +0200 Subject: update --- .config/i3/config | 1 + swift/etc/modprobe.d/swift5.conf | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 swift/etc/modprobe.d/swift5.conf (limited to 'swift') diff --git a/.config/i3/config b/.config/i3/config index ac85a15..7f094d2 100644 --- a/.config/i3/config +++ b/.config/i3/config @@ -87,6 +87,7 @@ for_window [class="llpp"] floating enable for_window [class="MuPDF"] floating enable for_window [class="Org.gnome.Software"] floating enable for_window [class="Pavucontrol"] floating enable +for_window [class="Pcmanfm"] floating enable for_window [class="Picard"] floating enable for_window [title="QEMU"] floating enable for_window [class="RSS Guard"] floating enable diff --git a/swift/etc/modprobe.d/swift5.conf b/swift/etc/modprobe.d/swift5.conf new file mode 100644 index 0000000..bda0f22 --- /dev/null +++ b/swift/etc/modprobe.d/swift5.conf @@ -0,0 +1,10 @@ +#options snd_hda_intel model=dell-headset-multi +#options snd_hda_intel power_save=1 +#options snd-intel-dspcfg dsp_driver=1 +options snd_sof_intel_hda_common hda_model=alc255-acer + +options i915 enable_fbc=1 +options i915 enable_psr=1 disable_power_well=0 +options i915 modeset=1 + +#blacklist snd_soc_skl -- cgit v1.3 From d30fd8ea96799196035cb53a1374a50dd967fedf Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 3 Oct 2022 13:24:45 +0200 Subject: update --- .mbsyncrc | 38 +++++++++++++++++++++++++++ .mutt/free | 8 ++++++ .mutt/muttrc | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ swift/etc/nsswitch.conf | 19 ++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 .mbsyncrc create mode 100644 .mutt/free create mode 100644 .mutt/muttrc create mode 100644 swift/etc/nsswitch.conf (limited to 'swift') diff --git a/.mbsyncrc b/.mbsyncrc new file mode 100644 index 0000000..dcfe913 --- /dev/null +++ b/.mbsyncrc @@ -0,0 +1,38 @@ +IMAPStore free-remote +Host imap.free.fr +SSLType IMAPS +User mvertes@free.fr +PassCmd "pass email/mvertes@free.fr" + +MaildirStore free-local +Path ~/Mail/free/ +Inbox ~/Mail/free/INBOX +Subfolders Verbatim + +Channel free +Far :free-remote: +Near :free-local: +Create Both +Expunge Both +Patterns * +SyncState * + +IMAPStore gmail-remote +Host imap.gmail.com +SSLType IMAPS +AuthMechs LOGIN +User marc.vertes@traefik.io +PassCmd "pass email/marc.vertes@traefik.io" + +MaildirStore gmail-local +Path ~/Mail/gmail/ +Inbox ~/Mail/gmail/INBOX +Subfolders Verbatim + +Channel gmail +Far :gmail-remote: +Near :gmail-local: +Create Both +Expunge Both +Patterns * !"[Gmail]/All Mail" !"[Gmail]/Important" !"[Gmail]/Starred" !"[Gmail]/Bin" +SyncState * diff --git a/.mutt/free b/.mutt/free new file mode 100644 index 0000000..4694401 --- /dev/null +++ b/.mutt/free @@ -0,0 +1,8 @@ +set folder = "~/Mail/free/" +set spoolfile = "+INBOX" +set postponed = "+Drafts" +set trash = "+Trash" +set record = "" + +set from = "mvertes@free.fr" +set realname = "Marc Vertes" diff --git a/.mutt/muttrc b/.mutt/muttrc new file mode 100644 index 0000000..817065b --- /dev/null +++ b/.mutt/muttrc @@ -0,0 +1,68 @@ +set folder=~/Mail/free +set spoolfile=+/INBOX +set header_cache=~/.cache/mutt +auto_view text/html +alternative_order text/plain text/enriched text/html + +color normal black default + +color hdrdefault red default +color signature blue default +color indicator black brightyellow +color error brightred default +color status white blue +color tree red default # the thread tree in the index menu +color tilde magenta default +color message blue default +color markers cyan default +color attachment brightmagenta default +color search black green # how to hilite searches in the pager +color quoted blue default # quoted text +color quoted1 magenta default +color quoted2 red default +color quoted3 green default +color quoted4 cyan default +color quoted5 blue default +color quoted6 magenta default +color quoted7 red default +color quoted8 green default +color quoted9 cyan default +color underline brightgreen default +color index green default ~F + +color header red default ^(From|Subject): +# point out url's +color body black default "((ftp|http|https)://|(file|news):|www\\.)[-a-z0-9_.:]*[a-z0-9](/[^][{} \t\n\r\"<>()]*[^][{} \t\n\r\"<>().,:!])?/?" +color body cyan default [-a-z_0-9.]+@[-a-z_0-9.]+ # e-mail addresses + +# smilies and the like +color body brightgreen default "<[Gg]>" +color body brightgreen default "<[Bb][Gg]>" +# see also the variables smileys +color body black yellow ">?[;:][-^]?[][)(><}{|/DP][)}]*" + +# +# Mono +# + +mono normal none # normal text +mono indicator reverse # actual message +mono tree none # thread arrows +mono status reverse # status line +#mono error bold +mono error standout +mono message none # info messages +mono quoted bold +mono signature none +mono attachment underline # MIME attachments +mono search reverse # search matches +mono tilde none # ~ at bottom of msg +mono markers bold # + at beginning of wrapped lines +mono hdrdefault none # default header lines +mono bold bold # hilite bold patterns in body +mono underline underline # hilite underlined patterns in body +mono header bold "^(from|subject):" +mono body underline "((ftp|http|https)://|(file|news):|www\\.)[-a-z0-9_.:]*[a-z0-9](/[^][{} \t\n\r\"<>()]*[^][{} \t\n\r\"<>().,:!])?/?" +mono body underline "[-a-z_0-9.]+@[-a-z_0-9.]+" +mono body bold "(^| )\\*[-a-z0-9äöüß*]+\\*[,.?]?[ \n]" +mono body underline "(^| )_[-a-z0-9äöüß_]+_[,.?]?[ \n]" diff --git a/swift/etc/nsswitch.conf b/swift/etc/nsswitch.conf new file mode 100644 index 0000000..392c640 --- /dev/null +++ b/swift/etc/nsswitch.conf @@ -0,0 +1,19 @@ +# Name Service Switch configuration file. +# See nsswitch.conf(5) for details. + +passwd: files systemd +group: files [SUCCESS=merge] systemd +shadow: files + +publickey: files + +# hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns +hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns +networks: files + +protocols: files +services: files +ethers: files +rpc: files + +netgroup: files -- cgit v1.3 From 5ea00546c6ee925235226871ab76ce9b08981029 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Tue, 4 Oct 2022 20:26:49 +0200 Subject: update --- swift/etc/resolv.conf | 1 + 1 file changed, 1 insertion(+) create mode 100644 swift/etc/resolv.conf (limited to 'swift') diff --git a/swift/etc/resolv.conf b/swift/etc/resolv.conf new file mode 100644 index 0000000..a336b7f --- /dev/null +++ b/swift/etc/resolv.conf @@ -0,0 +1 @@ +nameserver 9.9.9.9 -- cgit v1.3 From 0ef432a3c4a933016eccee7ddeddf77bd4955746 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Sun, 9 Oct 2022 12:33:42 +0200 Subject: update --- .backupignore | 3 +++ swift/etc/backupignore | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 swift/etc/backupignore (limited to 'swift') diff --git a/.backupignore b/.backupignore index bffc095..d44fbac 100644 --- a/.backupignore +++ b/.backupignore @@ -1,6 +1,9 @@ .*[Cc]ache/ *[Cc]ache/ CacheStorage/ +kernel-build/ +kernel-build.old/ +src/kernel.org/ go/pkg/ gopath/pkg/ sigfox/vm/ diff --git a/swift/etc/backupignore b/swift/etc/backupignore new file mode 100644 index 0000000..693cfa4 --- /dev/null +++ b/swift/etc/backupignore @@ -0,0 +1,32 @@ +# file patterns to be excluded from backup +/backup +.history/ +.cache/ +.cargo/ +.rustup/ +.npm/ +Cache/ +cache/ +GPUCache +CacheStorage +go/pkg/ +keybase/ +sdk/ +tmp/ +kernel-build/ +kernel-build.old/ +.xsession-errors +/var/lib/docker +/var/lib/flatpak +/var/lib/systemd/coredump/ +.config/chromium/ +.config/discord/ +.config/Slack/ +.config/Signal/ +.config/spotify/ +.mozilla/firefox/ +.thunderbird/xgfazjt1.default/ImapMail/ +.thunderbird/xgfazjt1.default/global-messages-db.sqlite +*.journal +*.log +*.o -- cgit v1.3 From 9dcf9d6a3fa8203cef7d57c8e811b300d4ecc97d Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Sun, 11 Dec 2022 17:53:36 +0100 Subject: update --- swift/etc/sudoers.d/01_marc | 1 + 1 file changed, 1 insertion(+) create mode 100644 swift/etc/sudoers.d/01_marc (limited to 'swift') diff --git a/swift/etc/sudoers.d/01_marc b/swift/etc/sudoers.d/01_marc new file mode 100644 index 0000000..9ae91f4 --- /dev/null +++ b/swift/etc/sudoers.d/01_marc @@ -0,0 +1 @@ +marc ALL=(ALL) NOPASSWD: ALL -- cgit v1.3 From 0a215cad87338787410af0df999d41c14f00c9e0 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Sat, 14 Jan 2023 18:32:46 +0100 Subject: update --- .bashrc | 2 + .forward | 1 + .xsession | 4 +- bin/dv | 653 +++++++++++---------------------------------- swift/etc/smtpd/smtpd.conf | 20 ++ 5 files changed, 180 insertions(+), 500 deletions(-) create mode 100644 .forward create mode 100644 swift/etc/smtpd/smtpd.conf (limited to 'swift') diff --git a/.bashrc b/.bashrc index adafe27..739bdb2 100644 --- a/.bashrc +++ b/.bashrc @@ -104,6 +104,8 @@ export -f mosht ssht() { ssh -t "$@" -- tmux new -A; } export -f ssht +sshs() { ssh -t "$@" -- screen -d -R; } + mpvx() { mpv --vo=sixel --profile=sw-fast --really-quiet "$@"; } export -f mpvx diff --git a/.forward b/.forward new file mode 100644 index 0000000..b561804 --- /dev/null +++ b/.forward @@ -0,0 +1 @@ +marc mvertes@free.fr diff --git a/.xsession b/.xsession index 33a4251..08383ba 100755 --- a/.xsession +++ b/.xsession @@ -17,8 +17,8 @@ hdmi xrdb ~/.Xresources #xsetroot -solid rgb:3/4/5 -#xsetroot -solid rgb:1/3/4 -feh --bg-fill ~/Pictures/night1.jpg +xsetroot -solid rgb:1/3/4 +#feh --bg-fill ~/Pictures/night1.jpg #feh --bg-fill ~/Downloads/Alaska_Range.jpg #conky #slock diff --git a/bin/dv b/bin/dv index 0737295..39164db 100755 --- a/bin/dv +++ b/bin/dv @@ -1,556 +1,213 @@ #!/bin/sh -# Local dv (aka sim) +# - Usage: dv command [options] [args] +# - dv is a dumb version management tool. +# - Options: +# - -a num set ancestor level (default 1) +# - -n dry-run mode, no changes are made +# - -v verbose mode +# - Commands: -dv_version='dv-0.23 Copyright 2013-2014 Marc Vertes, Philippe Bergheaud' unset CDPATH export LC_ALL=C IFS=' ' - -anc() { - usage 'anc [Version]' 'print ancestor' && return - getdv .dv || die no item - case $1 in - (""|.|$PWD) - [ "$Opt_N" ] && Opt_N=$(($Opt_N - 1)) - [ "$Opt_N" ] && info anc $R2 $Opt_N || echo $R2 +version=dv-0.2 +dvlib=${DVLIB:-$HOME/dvlib} +script="$(cd "$(dirname "$0")" && pwd)/${0##*/}" +aopt=1 + +case $(uname -o) in + (Android|Linux) + diffopt='--color=always' + lsopt='-v --color' ;; - (*) info anc $1 ${Opt_N:-1};; - esac -} + (Darwin) + diffopt='--color=always' + lsopt='-G' + ;; + (*BSD) + ;; +esac -cache() { - isremote "$1" || return - o=$1 _d=$cacheprefix/$1; pd=${_d%/*}; ppd=${pd%/*} t=$pd/.${_d##*/} - [ -d "$ppd" ] || mkdir -p "$ppd" - [ -L "$ppd/.dv." ] || ln -s . "$ppd/.dv." - [ -f "$_d/.dv" ] && return - [ -d "$pd" ] || mkdir -p "$pd" - set -- $pd/*; shift $(($# - 1)) - [ -d "$1" ] && ropt="--link-dest=../${1##*/}" || ropt= - rsync -aDS $ropt "$o/" "$t" && mv "$t" "$_d" +# anc [-a num] [dir] - prints the current ancestor of dir or current. +anc() { + set -- "$(dvdir "$1")" + for _ in $(seq "$aopt"); do + set -- "$1/.dv/anc" + done + [ -L "$1" ] && readlink -f "$1" } -client() { - usage 'client [Version]' 'print clients' && return - getdv .dv || die no item +# clone [-nv] v1 [dir] - clones an iterm version into dir (default: item). +clone() { case $1 in - (""|.|$PWD) - while getpdir .dv .. - do - cd "$R1" - getdv ".dv" - [ "$OptM" ] && echo "$R2 -> $PWD" || echo "$R2" - ((Opt_N = Opt_N-1)) || break - done ;; - (*) info cli $1 ${Opt_N:-9999} | sort -u ;; + ('') die 'missing argument' ;; + (*[/.-]*) set -- "$(path "$1")" "$2" ;; + (*) set -- "$(head "$1")" "$2" ;; esac + [ "$2" ] || { set -- "$1" "${1##*/}"; set -- "$1" "${2%%-*}"; } + [ -d "$1" ] || die "not found: $1" + rsync ${vopt:+"$vopt"} ${nopt:+"$nopt"} -a "$1/" "$2/" + rm -f "$2/.dv/anc" && ln -s "$1" "$2/.dv/anc" } -clone() { - usage 'clone [-A Author] [-m Msg] Version [Dir]' \ - 'Copy version to dir' && return - [ "$1" ] || die missing argument - [ "$3" ] && die too many arguments - getpdir .dv . && root=$R1 && getdv $root/.dv && lib=$R1 item=${R2%/*} - new_version=${1##*/} - if [ "$new_version" = "$1" ] - then - getdv .dv && lib=$R1 new_item=${R2%/*} || die no item - else - v=${1%/$new_version} - new_item=${v##*/} - [ "$new_item" = "$v" ] || new_lib=${v%/$new_item} - fi - [ "$PWD" = "$root" ] && [ "$item" != "$new_item" ] && - die "already a clone of $item" - lib=${lib:-$new_lib} - [ "$lib" ] || die no lib - [ "$new_lib" -a "$new_lib" != "$lib" ] && die "already in lib: $lib" - if [ "$new_version" = 0 ] # Init item in lib - then - initlib "$lib" - getdvinfo "$lib" || die "could not lock $lib" - mkdir -p /tmp/dv.$$/$new_item/0 - dv_write $new_item/0 $new_item/0 >/tmp/dv.$$/$new_item/0/.dv - { cat /tmp/dv.$$/$new_item/0/.dv; echo; } >>/tmp/dv.$$/.dvinfo.0 - ln -f /tmp/dv.$$/.dvinfo.0 /tmp/dv.$$/.dvinfo.1 - rsync -a /tmp/dv.$$/ "$lib" - fi - if [ ! "$2" ] # Use the item name as default directory (a la git) - then - set -- "$1" "${1%/*}" - set -- "$1" "${2##*/}" - echo cloning into "$2" - fi - [ ! -d "$2" ] && mkdir "$2" - cd "$2" || die cannot chdir to "$2" - # Rename existing supplier directories to allow supplier symlinks - find . -name .dv | while read l - do - l=${l%/.dv} && [ "$l" = "." ] && continue - mv "$l" "$l.dvold" - done - # Sync from lib, starting from most client item, up to last supplier - d=. s=$new_item/$new_version - while [ "$d" ] - do - [ -L "$d" ] && { - rm -f "$d" - [ -d "$d.dvold" ] && mv "$d.dvold" "$d" - } - cache "$lib/$s" && pref=$cacheprefix/ || pref= - rsync -aDS "$pref$lib/$s/" "$d" - dv_header "$d" Anc "$s" - dv_header "$d" Lib "$lib" - # Find next symlink pointing to a supplier - d= l= - eval "$(find . -type l | while read -r l - do - f=$(readlink "$l") - case $f in - (*/.dv./*) echo "d=\"$l\" s=\"${f#*/.dv./}\"" - break;; - esac - done)" +# desc - prints the descendants of a version +desc() { + set -- "$(path "$1")" + set -- "$1" "${1%/*}" + set -- "$1" "${2##*/}" + for a in "$dvlib/$2"/*/.dv/anc*; do + [ "$a" -ef "$1" ] && echo "${a%/*/*}" done } -desc() { - usage 'desc [Version]' 'print descendants' && return - getdv .dv || die no item - case $1 in - (""|.|$PWD) ;; - (*) info desc $1 ;; - esac +die() { + echo "$@" >&2 + exit 1 } -die() { echo "$0: fatal: $@" >&2; exit 1; } - +# diff [-a num] [[v1] v2] - prints differences (default: current and ancestor). diff() { - usage 'diff [-x pat] [-F File] [V1 [V2]]' 'Print differences' && return - getpdir .dv && getdv "$R1/.dv" || die not in a clone - lib=$R1 item=${R2%/*} old=${R2#*/} - [ "$lib" = "" ] && [ -L "../../.dv." ] && lib=${PWD%/*/*} - if [ "$2" ] - then - case $2 in - (.) new=. new_is_clone=1 ;; - (*) new=$lib/$item/$2 ;; - esac - cache "$new" && np=$cacheprefix/ || np= - old=$lib/$item/$1 - elif [ "$1" ] - then - case $1 in - (.) new=. new_is_clone=1 ;; - (*) new=$lib/$item/$1 ;; - esac - cache "$new" && np=$cacheprefix/ || np= - getdv "$np$new/.dv" && old=${R1:-$lib}/$R2 + if [ "$2" ]; then + set -- "$(path "$2")" "$(path "$1")" + elif [ "$1" ]; then + set -- "$(path "$1")" "$(anc "$(path "$1")")" else - new=$PWD new_is_clone=1 - cache "$new" && np=$cacheprefix/ || np= - getdv "$np$new/.dv" && old=${R1:-$lib}/$R2 + set -- "$(dvdir)" "$(anc)" fi - cache "$old" && op=$cacheprefix/ || op= - [ "$Opts" ] || printf "old %s\nnew %s\n" "$old" "$new" - # Itemized diff for all suppliers, deepest first - cd "$np$new" && for f in $(find . -type f -name .dv | sort -r) - do - d=${f%/.dv} - [ "$d" = . ] && prefix= || prefix=${d#./}/ - getdv "$f" && cache "$lib/$R2" - [ "$new_is_clone" ] && dest=$np$d || dest=$prefix$d - diffdir "$op$lib/$R2" "$dest" - Optx="$Optx --exclude=${d##*/}" - done -} - -# Usage: diffdir oldpath newpath -# Print differences between 2 directories -diffdir() { - [ -f "$2/.dvignore" ] && xf=--exclude-from=$2/.dvignore || xf= - rsync -aDSniv $xf --delete --exclude=".dv.*/" $Optx "$2/" "$1" | - awk -v OptF="${OptF#./}" -v prefix=$prefix ' - NF == 0 {exit} - NR < 2 || /\/*\.dv$/ || /\/$/ {next} - # Match an itemized status for all versions of rsync -i - $1 !~ /^[<>ch.*][fdLDS+][.+?cstpoguaxz]+$/ {next} - {key = $1; file = substr($0, length(key) + 2)} - OptF && OptF != file {next} - key == "*deleting" {print "deleted " prefix file; next} - substr(key, 3, 7) == "+++++++" {print "created " prefix file; next} - { # Avoid false positive if only mtime is changed. - of = "'$1'/" file; gsub("'\''", "'\'\\\\\'\''", of) - nf = "'$2'/" file; gsub("'\''", "'\'\\\\\'\''", nf) - if (substr(key, 2, 1) == "L") { # Symlink - src = target = file - sub(/.* -> /, "", target); - sub(/ -> .*/, "", src); - "readlink '$2'/" src | getline otarget - if (target != otarget) - print "changed " src - } else if (system("cmp -s '\''" of "'\'\ \''" nf "'\''")) - print "changed " file - }' - # Or: scan key for file/link size, checksum or permission change - # rsync -c is required - #key ~ /[cps]/ { print "changed " prefix file }' + [ "$2" ] && command diff $diffopt -U 3 -x .dv "$2" "$1" | less -F } -dv_write() { - cat <<- EOT - From $(username) - Date: $(date +"%F %T %z") - Version: $1 - Anc: $2 - EOT - - [ "$OptA" ] && echo "Author: $OptA" - printf "\n%s\n" "$Optm" +# dvdir prints the dir containing .dv. +dvdir() { + set -- "$(realpath "${1:-.}")" + while [ "$1" ]; do + [ -d "$1/.dv" ] && echo "$1" && return + set -- "${1%/*}" + done } -dv_header() { - awk -v val="$3" '/^'$2':/ {print "'$2': " val; done = 1; next} - NF == 0 && done == 0 {print "'$2': " val; done = 1} - {print}' $1/.dv >$1/.dv.$$ && mv $1/.dv.$$ $1/.dv +# head - prints the branch head versions. +head() { + for v in "$dvlib/${1:-$(name)}/"*; do + [ "$(desc "$v")" ] || echo "$v" + done } -# Usage: getdv path -# Return lib in R1, anc in R2, version in R3 -getdv() { - R1= R2= - while read -r line - do +# help - prints this help text. +help() { + while read -r line; do case $line in - ("Lib: "*) R1=${line#Lib: };; - ("Anc: "*) R2=${line#Anc: };; - ("Version: "*) R3=${line#Version: };; + (\#*\ -\ *) ;; + (*) continue ;; esac - done <$1 - [ "$R1" -o "$R2" ] + set -- "${line% - *}" "${line#* - }" + [ "$1" = '#' ] || printf " %-26s" "${1#\# }" + echo "$2" + done < "$script" } -# Usage: getdvinfo lib -# Get exclusive write access to a dvlib, for new version commit -getdvinfo() { - [ -d /tmp/dv.$$ ] || mkdir /tmp/dv.$$ - [ "$Optn" ] && { rsync "$1/.dvinfo.1" /tmp/dv.$$/.dvinfo.0; return; } - t=0 - for i in 1 2 3 4 5 - do - rsync --remove-source-files "$1/.dvinfo.0" /tmp/dv.$$/ && break - t=$(($t + $i)) && sleep $t - done - test -f /tmp/dv.$$/.dvinfo.0 +# incv increments version. +incv() { + set -- "$1" "${1##*[-.a-z_A-Z]}" + set -- "${1%"$2"}" "$2" + echo "$1$(($2 + 1))" } -putdvinfo() { - [ "$Optn" ] && return - ln -f /tmp/dv.$$/.dvinfo.0 /tmp/dv.$$/.dvinfo.1 - rsync -a /tmp/dv.$$/.dvinfo.[01] "$1/" - isremote "$1" && cp /tmp/dv.$$/.dvinfo.0 "$cacheprefix/$1/" +# init - creates an initial clone in the current directory. +init() { + [ "$(dvdir)" ] && die "already initialized: $(dvdir)" + mkdir .dv } -# Usage: getpdir file [path] -# Return absolute parent dir of path or PWD containing file -getpdir() { - R1="$([ -d "${2:-.}" ] && cd "${2:-.}" && pwd)" - while [ "$R1" ] - do - [ -f "$R1/$1" ] && return || R1=${R1%/*} - done - return 1 -} +# ls [item] - lists dvlib. +ls() ( + cd "$dvlib" && command ls $lsopt "$@" +) -# Usage: getprd file [path] -# Return relative path to parent directory containing file -getprd() { - R2="$(cd "${2:-.}" && pwd)"; R2=${R2%/*} R1=.. - while [ "$R2" ] - do - [ -f "$R2/$1" ] && return || R2=${R2%/*} R1=$R1/.. - done - return 1 +# name prints the item name. +name() { + set -- "$(dvdir)" + [ "$1" ] && echo "${1##*/}" || die "not a dv item, no .dv found" } -info() { - usage info && return - case $2 in - (*:*) lib=${2%/*/*} ;; - (*) getpdir .dv && getdv $R1/.dv && lib=$R1 || die no dvlib found - esac - case $2 in # $2 specifies: - (*/*/*) v=${2%/*/*}; v=${2#$v/} ;; # lib/item/version - (*/*) v=$2 ;; # item/version - (*) v=${R2%/*}/$2 ;; # version +# path prints the version path, if exist. +path() { + case $1 in + (*/*|.) dvdir "$1"; return ;; + ([0-9]*) set -- "$(name)-$1" ;; esac - isremote "$lib" && { - p=$cacheprefix - [ -d "$p/$lib" ] || mkdir -p "$p/$lib" - [ "$Optl" ] || rsync -a "$lib/.dvinfo.1" "$p/$lib/" - } || p= - info_query $1 $v $3 <$p/$lib/.dvinfo.1 -} - -info_query() -{ - awk -v arg0=$1 -v arg1=$2 -v arg2=$3 ' - /^From / { - if (v) msg[v] = var["Body"] - delete var - var["From"] = substr($0, 6) - header = 1 - next - } - header == 1 && NF == 0 { - v = var["Version"]; a = var["Anc"]; s = var["Sup"] - if (a != v) { - anc[v] = a; desc[a] = desc[a] ? desc[a] " " v : v - } - n = split(s, as) - for (i = 1; i <= n; i++) { - cli[as[i]] = cli[as[i]] ? cli[as[i]] " " v : v - } - sup[v] = s; msg[v] = var["Msg"]; date[v] = var["Date"] - if (var["Root"]) root[v] = var["Root"] - header = 0 - next - } - header == 1 { - i = index($0, ":") - var[substr($0, 1, i-1)] = substr($0, i+2) - next - } - header == 0 { - if ($0 ~ />+From /) sub(/>/, "") - var["Body"] = var["Body"] ? var["Body"] "\n" $0 : $0 - } - END { - if (v) msg[v] = var["Body"] - if (arg0 == "graph") anc_graph() - else if (arg0 == "anc") query_anc(arg1, arg2) - else if (arg0 == "sup") query_sup(arg1, arg2) - else if (arg0 == "cli") query_cli(arg1, arg2) - else if (arg0 == "log") print msg[arg1] - else if (arg0 == "from") print from[arg1] - else if (arg0 == "date") print date[arg1] - else if (arg0 == "desc") printl(desc[arg1]) - } - function anc_graph() { - print "digraph G {" - for (v in anc) print "\"" anc[v] "\" -> \"" v "\"" - print "}" - } - function query_anc(v, n) { while (n-- > 0) v = anc[v]; print v } - function query_cli(v, n) { - while (n-- > 0 && v != "") { - num = split(v, av); v = "" - for (i = 1; i <= num; i++) { - printl(cli[av[i]]) - v = v ? v " " cli[av[i]] : cli[av[i]] - } - } - } - function query_sup(v, n) { - while (n-- > 0 && v != "") { - num = split(v, av); v = "" - for (i = 1; i <= num; i++) { - printl(sup[av[i]]) - v = v ? v " " sup[av[i]] : sup[av[i]] - } - } - } - function printl(l, i, n) { - n = split(l, al) - for (i = 1; i <= n; i++) - if (root[al[i]]) - print al[i] " -> '"$PWD/"'" root[al[i]] - else - print al[i] - }' + set -- "${1%%-*}" "${1#*-}" + [ -d "$dvlib/$1/$1-$2" ] && echo "$dvlib/$1/$1-$2" } -initlib() { - rsync --list-only "$1/.dv." >/dev/null 2>&1 && return - mkdir -p /tmp/dv.$$ - ln -s . /tmp/dv.$$/.dv. - >/tmp/dv.$$/.dvinfo.0 - >/tmp/dv.$$/.dvinfo.1 - chmod g+w /tmp/dv.$$/.dvinfo.[01] - rsync -a /tmp/dv.$$/ "$1" -} +# save [-nv] [v1] - creates a new version from clone. +save() { + [ "$1" ] && case $1 in (*[0-9]) ;; (*) die "invalid version: $1" ;; esac + set -- "$(dvdir)" "$(aopt=1 anc)" "$(name)" "${1#[a-zA-Z_]*-}" + set -- "$1" "$2" "$3" "${4:-$(incv "${2##*/[a-zA-Z_]*-}")}" + echo "$dvlib/$3/$3-$4" + command diff -q -x .dv "$2" "$1" >/dev/null 2>&1 && die 'no changes, abort' + [ "$nopt" ] && return -isremote() { case $1 in (*:*) return;; esac; return 1; } + # Update ancestor in clone then copy in dvlib. + rm -f "$1/.dv/anc" && [ "$2" ] && ln -s "../../${2##*/}" "$1/.dv/anc" + rsync ${vopt:+"$vopt"} -a ${2:+--link-dest="$2"} --mkpath "$1/" "$dvlib/$3/$3-$4/" -help_all() { - printf "$dv_version\nUsage: dv command [options] [args]\n" - Opth=1; for c in $Cmdlist; do $c; done + # After save, clone ancestor points to new saved version. + rm -f "$1/.dv/anc" && ln -s "$dvlib/$3/$3-$4" "$1/.dv/anc" } -newversion() { - [ "$OptV" ] && R1=$OptV && return - case $OptB in - ('') R1=$1 ;; - (*[-/]*) die 'illegal character [-/] in branch name' ;; - (*[0-9.]) die 'illegal end character [0-9.] in branch name' ;; - (*) case $1 in (*-${OptB}[1-9]*) R1=$1;; (*) R1=$1-${OptB}0;; esac ;; - esac - R2=${R1##*[!0-9]} - optb=$Optb - [ "$optb" ] && R3=.1 optb=${optb%b} || R3= R1=${R1%$R2}$(($R2 + 1)) - while [ "${optb}" ]; do optb=${optb%b} R3=.0$R3; done - R1=$R1$R3 - while grep -q "^Version: $item/$R1\$" /tmp/dv.$$/.dvinfo.0 - do - R2=${R1##*[!0-9]} - [ "$R2" ] && R1=${R1%$R2}$(($R2 - 1)).1 || R1=${R1}1 - done +# status - prints dv informations. +status() { + echo "lib: $dvlib" + set -- "$(dvdir)" "$(anc)" + [ "$1" ] || die "not a dv item, no .dv found" + echo "root: $1" + [ "$2" ] || die "no ancestor found, please save it first" + echo "anc: $2" + command diff -q -x .dv "$2" "$1" } -patch() { - usage 'patch [-x pat] [-F File] [Dir|Version]' \ - 'Print patch diff from ancestor' && return - diff "$@" | awk -v wdflag="-v${OptD:+3}${OptN:+1}${OptO:+2}" ' - { key = $1; file = substr($0, length(key) + 2) } - key == "old" { old = (file ~ /:/ ? "'$cacheprefix'/" : "") file; next } - key == "new" { new = (file ~ /:/ ? "'$cacheprefix'/" : "") file; next } - { - of = old "/" file; gsub("'\''", "'\'\\\\\'\''", of) - nf = new "/" file; gsub("'\''", "'\'\\\\\'\''", nf) - system("diff -Naup '\''" of "'\'\ \''" nf "'\''; echo") - }' +# sync [url] - synchronize a remote dvlib. +sync() { + set -- "${1:-$(cat "$dvlib/.url" 2>/dev/null)}" + [ "$1" ] || die "missing url" + [ "$(cat "$dvlib/.url" 2>/dev/null)" = "$1" ] || echo "$1" > "$dvlib/.url" + rsync ${vopt:+"$vopt"} ${nopt:+"$nopt"} -aH --mkpath "$1/" "$dvlib/" + rsync ${vopt:+"$vopt"} ${nopt:+"$nopt"} -aH --mkpath "$dvlib/" "$1/" } -save() { - usage 'save [-bln] [-A Author] [-m msg] [-x pat] [-B Branch|-V Version] [Dir]'\ - 'Save dir into a new version' && return - [ "$2" ] && die 'too many arguments' - getpdir .dv "$1" || die "not in a clone: ${1:-$PWD}" && root=$R1 - cd "$root" - getdv .dv && lib=$R1 && getdvinfo "$lib" - # Process supplier subdirs from the deepest up to "." (most client) - for d in $(find . -type f -name .dv | sort -r) - do - d=${d%/.dv} - cd "$root/$d" - OptF= save1 "$d" && nanc=$R1 && echo $nanc - [ "$d" = . ] && continue # not a supplier, done - - # Replace supplier subdir by symlink in lib - getprd .dv && s=$R1/../.dv./$nanc - t=${d##*/}; t=.dv.$t - mv "$root/$d" "$root/${d%/*}/$t" - ln -s "$s" "$root/$d" - done - putdvinfo "$lib" - # Restore supplier subdirs and remove links to lib, deepest first - find . -type d -name ".dv.*" | sort -r | while read d - do - t=${d##*/.dv.}; t=${d%/*}/$t - rm -f "$t" && mv "$d" "$t" - done +# version - prints the current version of dv. +version() { + echo "$version" } -save1() { - getdv .dv && lib=$R1 anc=$R2 && item=${anc%/*} old=${anc#*/} - [ "$(diffdir "$lib/$anc" .)" ] || { R1=$anc; return; } - newversion $old && new=$item/$R1 - [ "$Optn" ] || dv_write "$new" "$anc" >.dv - # Compute list of direct suppliers, for caching in .dvinfo.0 - lsup=$(find . -type l | while read -r l - do - case $l in (*/.dv.*) continue ;; esac - f=$(readlink "$l") - case $f in (*/.dv./*) printf "%s " ${f#*/.dv./} ;; esac - done) - [ ! "$Optn" ] && [ "$lsup" ] && dv_header . Sup "$lsup" - { cat .dv; echo; } >>/tmp/dv.$$/.dvinfo.0 - [ -f ".dvignore" ] && xf=--exclude-from=.dvignore || xf= - rsync -aDS$Optn$Optv --link-dest=../$old $xf --exclude=".dv.*/" \ - ./ "$lib/$new" - R1=$new - [ "$Optn" ] && return - isremote "$lib" && rsync -aDS --link-dest=../$old --exclude=".dv.*/" \ - ./ "$cacheprefix/$lib/$new" - dv_header . Anc "$new" - dv_header . Lib "$lib" -} - -supplier() { - usage 'supplier [Version]' 'print suppliers' && return - getdv .dv || die no item +# Main program starts here. +[ "$DVDEBUG" ] && set -x || case $1 in - (""|.|$PWD) # create a temporary dvinfo file, query it - V=$R2; find . -name .dv | - while read dv - do - [ "$dv" = "./.dv" ] && continue - # get the supplier - getdv "$dv"; v=$R2; dv=${dv%/.dv} - # get the client - getpdir .dv "${dv%/*}"; getdv "$R1/.dv" - # declare the client as supplier - printf "From \nVersion: %s\nSup: %s\n" "$v" "$R2" - [ "$OptM" ] && echo "Root: ${dv#./}"; echo - done | info_query cli $V ${Opt_N:-9999} ;; - (*) info sup $1 ${Opt_N:-9999} ;; - esac | sort -u -} - -usage() { [ "$Opth" ] && printf " %-34s %s\n" "$1" "$2"; } - -username() { - case $(uname -s) in - (Darwin) id -P | awk -v FS=: '{print $8}' ;; - (*) awk -v FS=[:,] '/^'$USER':/ {print $5; exit}' /etc/passwd ;; + (anc|clone|desc|diff|head|help|init|ls|path|save|status|sync|version) ;; + (*) help; exit 1;; esac -} - -wdiff() { - usage 'wdiff [-DNO] [-x pat] [-F File] [Dir|Version]' \ - 'Print word diffs from ancestor' && return - diff "$@" | - awk -v wdflag="-v${OptD:+3}${OptN:+1}${OptO:+2}" ' - { key = $1; file = substr($0, length(key) + 2) } - key == "old" { old = (file ~ /:/ ? "'$cacheprefix'/" : "") file; next } - key == "new" { new = (file ~ /:/ ? "'$cacheprefix'/" : "") file; next } - { - of = old "/" file; gsub("'\''", "'\'\\\\\'\''", of) - nf = new "/" file; gsub("'\''", "'\'\\\\\'\''", nf) - system("wd " wdflag " '\''" of "'\'\ \''" nf "'\''; echo") - }' | less -FCimnqGrX -j5 -h0 +/'\[0' -} - -cacheprefix=$HOME/.cache/dv -Cmdlist='anc client clone desc diff info patch save supplier wdiff' -while getopts :nvV opt # Parse global options -do +cmd="$1" +shift +while getopts :a:nv opt; do case $opt in - (V) echo "$dv_version"; exit ;; - (*) help_all; exit ;; + (a) aopt="$OPTARG" ;; + (n) nopt=-n ;; + (v) vopt=-v ;; + (*) help; exit ;; esac done shift $((OPTIND - 1)) -[ $1 ] && C=$1 && shift 1 || { help_all; exit 1; } -for c in $Cmdlist -do - case $c in - ($C|_$C) cmd=$c; break;; - ($C*) [ $cmd ] && die ambiguous command $C || cmd=$c;; - esac -done -while getopts :0123456789A:bB:F:hl:m:MnNOsvV:x: opt # Parse command options -do - case $opt in - ([0-9]) Opt_N=$Opt_N$opt;; - ([bhlnMNOsv]) eval Opt$opt=\${Opt$opt}$opt ;; - ([ABFmV]) eval Opt$opt=\$OPTARG ;; - (x) Optx="$Optx --exclude=$OPTARG" ;; - (*) Opth=1; $cmd; exit 1;; - esac -done -shift $(($OPTIND - 1)) -trap "rm -rf /tmp/dv.$$" EXIT -[ "$cmd" ] || die "no command \"$C\"" && $cmd "$@" +$cmd "$@" + +# Todo: +# * a function to squash a branch in the trunk +# * merge another ancestor (use anc0, anc1, ...) +# * vendor management +# * show graphs (dot) +# * sync: dvlib sync / mirror: resolve conflict by branching +# * rename version. +# * .dvignore +# * make dvlib versions immutable. diff --git a/swift/etc/smtpd/smtpd.conf b/swift/etc/smtpd/smtpd.conf new file mode 100644 index 0000000..ac4dabf --- /dev/null +++ b/swift/etc/smtpd/smtpd.conf @@ -0,0 +1,20 @@ +# $OpenBSD: smtpd.conf,v 1.10 2018/05/24 11:40:17 gilles Exp $ + +# This is the smtpd server system-wide configuration file. +# See smtpd.conf(5) for more information. + +table aliases file:/etc/smtpd/aliases +table secrets file:/etc/smtpd/secrets + +# To accept external mail, replace with: listen on all +# +listen on localhost + +action "local" maildir alias +action "relay" relay host smtps://mvertes@smtp.free.fr auth + +# Uncomment the following to accept external mail for domain "example.org" +# +# match from any for domain "example.org" action "local" +match for local action "local" +match for any action "relay" -- cgit v1.3