X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=commitid.scad.pl;h=e51318aaf26ba755d3be754fd6a867f64770898f;hb=f8a450af5183bd37b15ebb2cd85047c45066f474;hp=33ab57d8cc8db00592a43970cb8cc3a77c3bebe3;hpb=8c3df00029d49a38603bbb1f644ae71590d0e631;p=reprap-play.git diff --git a/commitid.scad.pl b/commitid.scad.pl index 33ab57d..e51318a 100755 --- a/commitid.scad.pl +++ b/commitid.scad.pl @@ -25,7 +25,7 @@ $SIG{__WARN__} = sub { die @_; }; # generate a form FORM containing TEXT # TEXT can contain newlines (final newline usually undesirable) # if FORM not specified, generates Arg0 Arg1 Arg2 in sequence -# character set is SPC 0-9 a-f + * (`*' glyph is `=/='). +# character set is SPC 0-9 a-f + * # # We generate a physical indication of which commit was used. # @@ -52,55 +52,48 @@ $SIG{__WARN__} = sub { die @_; }; # # We can generate these forms: # -# Small3: -# Small4: -# Small5: -# Small6: -# Small7: -# Small8: -# Small9: -# Small10: +# In each case: +# if tree is dirty, * is suffixed or prefixed to count or commitid +# if tree has untracked files, + is added +# (where it is added depends on the Form; in any case it does not +# change the size, but steals space from digits) +# +# Small2 Small3 ... Small10: # git rev-list --first-parent --count HEAD # typically 3-4 characters but we allow for up to 6 # padded with zeroes; if too long we reduce mod 10^n -# eg -# Small4 1070 -# If tree is dirty, + or * is suffixed, reducing number of -# digits by 1. +# eg if the count is 123456 +# Small5 3456* +# Small8 __123456 (where _ are spaces) # -# Small4S: -# Small6S: -# Small8S: -# Small10S: -# same but split into two lines eg -# Small4S 10 -# 70 +# Small2S Small4S ... Small10S: +# Small3T Small9T: +# same but split into two lines (S) or three lines (T) eg +# Small4S 45 Small6T _3 +# 6* 45 +# 6* # -# Git4 Git4S -# Git6 Git6S -# Git8 Git8S -# Git10 Git10S +# Git2 Git3 ... Git10: +# Git4S Git6S ... Git10S: +# Git6T Git9T: # git-rev-parse HEAD (prefix of requested length) -# eg -# Git6 82f2a2 -# If tree is dirty, + or * is suffixed to commitid, -# reducing number of hex digits by 1. - -# Full3 -# Full4 -# Full5 -# Full6 -# Full7 -# Full8 -# Full9 -# Full10 +# eg if the commitid is abcdef0123... +# Git5 abcd* + +# Full4 Full6 ... Full20: # git-rev-list --first-parent --count HEAD # git-rev-parse HEAD +# (all on two lines) # eg -# Full6 1070 -# 82f2a2 -# If tree is dirty, + or * is suffixed to count (but not to -# commitid) reducing number of digits by 1. +# Full6 abcdef Full8 abcdef01 +# 23456* _123456* +# +# Full6T Full9T ... Full30T +# as Full but commit is split over two lines +# for a 3-line message; eg +# Full9T abc +# de* +# 456 # # FontDemo # @@ -127,6 +120,15 @@ sub chrmodname ($) { return "Commitid__chr_$chrx"; } +our $gtm_demo_i = -1; +our $gtm_demo_j; +our @gtm_demo_o; + +sub gentextmodule_demo_start_batch () { + $gtm_demo_j = 0; + $gtm_demo_i++; +} + sub gentextmodule ($@) { my ($form, @lines) = @_; my $modb = "Commitid_$form"; @@ -139,9 +141,9 @@ sub gentextmodule ($@) { $y--; my $x = 0; foreach my $chr (split //, $line) { - next if $chr !~ m/\S/; p sprintf " translate([%d * 0.8, %d * 1.2]) %s();\n", - $x, $y, chrmodname $chr; + $x, $y, chrmodname $chr + if $chr =~ m/\S/; $x++; } $cols = $x if $x > $cols; @@ -152,8 +154,20 @@ sub gentextmodule ($@) { p " d=Commitid_depth();\n"; p " translate([0,0,-d]) linear_extrude(height=d*2) ${modb}_2D();\n"; p "}\n"; + p sprintf "function %s_sz() = Commitid__scale() * 0.1 * [ %d, %d ];\n", $modb, 2 * ($cols * 4 - 1), 2 * (@lines * 6 - 1); + + push @gtm_demo_o, < $sz - ? substr($whole, $lw-$sz) - : sprintf "%${sz}s", $whole; + my $spare = $sz - $lw - (length $prefix); + return + ($spare > 0 ? (' ' x $spare) : ''). + $prefix. + substr($whole, ($spare < 0 ? -$spare : 0)); } -sub ljustt ($$$) { # always includes $suffix +sub ljustt ($$;$) { my ($sz, $whole, $suffix) = @_; + $suffix //= ''; $sz -= length $suffix; return sprintf "%-${sz}.${sz}s%s", $whole, $suffix; } -sub gentextmodule_plusq ($$) { - my ($form, $s) = @_; +sub genform ($@) { + my ($form, @lines) = @_; + gentextmodule($form, @lines); + my $f = { + Form => $form, + Chars => (length join '', @lines), + Lines => (scalar @lines), + Ambiguous => ($form =~ m/Full/ && !grep { m/\W/ } @lines), + }; + push @forms, $f; +} + +sub genform_q ($$$) { + my ($form, $s, $lines) = @_; + $gtm_demo_j++; my $l = length $s; - gentextmodule($form, $s); - if (!($l & 1) && $l>=4) { - gentextmodule("${form}S", substr($s,0,$l/2), substr($s,$l/2)); - } + return if $l % $lines; + my $e = $l/$lines; + return if $e < 2; + $gtm_demo_j--; + genform($form, $s =~ m/.{$e}/g); +} + +sub genform_plusq ($$) { + my ($form, $s) = @_; + genform($form, $s); + genform_q("${form}S", $s, 2); + genform_q("${form}T", $s, 3); } our @gcmd; @@ -310,19 +352,66 @@ sub do_git () { $git_object = gitoutput qw(rev-parse HEAD); } - foreach my $sz (3..10) { - gentextmodule_plusq("Small$sz", rjustt($sz, $git_count.$git_dirty)) + foreach my $sz (2..10) { + gentextmodule_demo_start_batch(); + + genform_plusq("Small$sz", rjustt($sz, $git_count, $git_dirty)) if defined $git_count; - gentextmodule_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty)) + genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty)) if defined $git_object; - gentextmodule("Full$sz", - rjustt($sz, $git_count.$git_dirty), - ljustt($sz, $git_object, '')) - if defined $git_count && defined $git_object; + if (defined $git_count && defined $git_object) { + genform("Full".($sz*2), + ljustt($sz, $git_object), + rjustt($sz, $git_count, $git_dirty)); + + my $e = $sz; + genform("Full".($e*3)."T", + ljustt($e*2, $git_object, $git_dirty) + =~ m/.{$e}/g, + rjustt($e, $git_count)); + } } -} +} + +sub do_some_best ($$) { + my ($modname, $formre) = @_; + p "module Commitid_$modname(max_sz) {\n"; + foreach my $f ( + sort { + $b->{Chars} <=> $a->{Chars} or + $a->{Lines} <=> $b->{Chars} + } + grep { + $_->{Form} =~ m/$formre/ && + !$_->{Ambiguous} + } + @forms + ) { + p "// $f->{Form}\n"; + } + p "}\n"; +} + +sub do_git_best () { + return unless $do_git; + + # Auto-computer for `best fit' + # + # We have two best fit approaches: with count, and git-object-id-only + # + # For `with count', we only ever include the git object id if the + # result would be unambigous. That means that at least one space + # or punctuation was generated. + # + # We sort the options by firstly number of characters + # (decreasing), and then by number of lines (increasing) and + # try each one both ways round. + + do_some_best('BestCount', 'Small|Full') if $do_git =~ m/c/; + do_some_best('BestObjid', 'Git|Full') if $do_git =~ m/o/; +} while (@ARGV) { $_ = shift; @@ -348,9 +437,17 @@ while (@ARGV) { $do_git //= defined($argcounter) ? '' : 'co'; +gentextmodule_demo_start_batch(); gentextmodule('FontDemo', @demo); do_git(); +do_git_best(); + +p "module Commitid_2DDemo(){\n"; +p " st = Commitid__scale() * [ 10, 5 ];\n"; +p " e = Commitid_pixelsz();\n"; +p $_ foreach @gtm_demo_o; +p "}\n"; flush STDOUT or die $!; close STDOUT or die $!; @@ -383,8 +480,8 @@ a b c d e f + * - r - # ### -### # - # ### - L + # # + # \#/ +### ### + # /#\ + # #