source: trunk/project-meta/project-meta @ 158

Last change on this file since 158 was 158, checked in by g7moreau, 6 years ago
  • Add make-copyright command
  • Property svn:executable set to *
File size: 6.6 KB
Line 
1#!/usr/bin/env perl
2#
3# 2018/01/17 Gabriel Moreau
4#
5# apt-get install libyaml-syck-perl libtemplate-perl
6
7use strict;
8use warnings;
9
10use File::Copy qw{copy};   
11use YAML::Syck;
12use Getopt::Long();
13use Cwd();
14use Template;
15
16
17my ($verbose);
18Getopt::Long::GetOptions(
19   'verbose' => \$verbose,
20   );
21
22
23my %CMD_DB = (
24   'help'            => \&cmd_help,
25   'version'         => \&cmd_version,
26   'check'           => \&cmd_check,
27   'make-link'       => \&cmd_make_link,
28   'make-author'     => \&cmd_make_author,
29   'make-licence'    => \&cmd_make_licence,
30   'make-copyright'  => \&cmd_make_copyright,
31   );
32
33################################################################
34# main program
35################################################################
36
37my $cmd = shift @ARGV || 'help';
38if (defined $CMD_DB{$cmd}) {
39   $CMD_DB{$cmd}->(@ARGV);
40   }
41else {
42   print {*STDERR} "project-meta: command $cmd not found\n\n";
43   $CMD_DB{'help'}->();
44   exit 1;
45   }
46
47exit;
48
49################################################################
50# subroutine
51################################################################
52
53################################################################
54# command
55################################################################
56
57sub cmd_help {
58   print <<END;
59NAME
60   $0 - action on project metadata
61
62SYNOPSIS
63   $0 [-verbose] check
64END
65   }
66
67################################################################
68
69sub cmd_version {
70   print "0.01\n";
71   }
72
73################################################################
74
75sub print_ok {
76   my ($key, $test) = @_;
77   
78   printf "%-35s : %s\n", $key, $test ? 'yes' : 'no';
79   }
80
81################################################################
82
83sub cmd_check {
84   my $meta = YAML::Syck::LoadFile("PROJECT-META.yml");
85
86   my $acronym     = $meta->{'project'}{'acronym'};
87   my $current_dir = Cwd::getcwd();
88   my $dap_folder  = $meta->{'public-dap'}{'dap-folder'};
89
90   print_ok 'project/acronym',                  $acronym =~ m{\d\d\w[\w\d_]+};
91   print_ok 'public-dap/dap-folder',            $dap_folder ne '' and $dap_folder =~ m{^/};
92   print_ok 'dap-folder not match current_dir', $dap_folder !~ m{$current_dir};
93
94   #print YAML::Syck::Dump($meta);
95   }
96
97################################################################
98
99sub addfolder2list {
100   my ($folderdb, $folder) = @_;
101   
102   $folder =~ s{/[^/]+$}{};
103   $folderdb->{$folder}++;
104
105   addfolder2list($folderdb, $folder) if $folder =~ m{/};
106   }
107
108################################################################
109
110sub cmd_make_link {
111   my $meta = YAML::Syck::LoadFile("PROJECT-META.yml");
112   my $acronym = $meta->{'project'}{'acronym'};
113   my $current_dir = Cwd::getcwd();
114   my $dap_folder = $meta->{'public-dap'}{'dap-folder'};
115
116   # Create a list of the folder
117   my %folders;
118   for my $dataset (@{$meta->{'public-dap'}{'data-set'}}) {
119      addfolder2list(\%folders, $dataset);
120      }
121
122   print "chmod o+rX,o-w $current_dir\n";
123   for my $folder (sort keys %folders) {
124      print "chmod o+rX,o-w $current_dir/$folder\n";
125      print "mkdir -p $dap_folder/$acronym/$folder\n";
126      }
127
128   for my $dataset (@{$meta->{'public-dap'}{'data-set'}}) {
129      my $folder = $dataset =~ s{/[^/]+$}{}r;
130      print "ln --symbolic --target-directory $dap_folder/$acronym/$folder/ $current_dir/$dataset\n";
131
132   print "chmod -R o+rX,o-w $dap_folder/$acronym/\n";
133      }
134   }
135
136################################################################
137
138sub cmd_make_author {
139   my $meta = YAML::Syck::LoadFile("PROJECT-META.yml");
140
141   my $current_dir = Cwd::getcwd();
142
143   my $acronym    = $meta->{'project'}{'acronym'};
144   my $authors_list = $meta->{'project'}{'authors'};
145
146   if (-f "$current_dir/AUTHORS.txt") {
147      # Test for manual or automatically generated file
148      # Automatically generated file by project-meta
149      my $automatic;
150      open my $fh, '<', "$current_dir/AUTHORS.txt" or die $!;
151      for my $line (<$fh>) {
152         $line =~ m/Automatically generated .* project-meta/i and $automatic++;
153         }
154      close $fh;
155
156      if (not $automatic) {
157         print "Warning: AUTHORS.txt already exists\n";
158         return;
159         }
160
161      print "Warning: update AUTHORS.txt\n";
162      }
163
164   my $tt = Template->new(INCLUDE_PATH => '/usr/share/project-meta/template.d');
165   my $msg_format = '';
166   $tt->process('AUTHORS.tt',
167      {
168         acronym    => $acronym,
169         authorlist => $authors_list,
170      }, \$msg_format) || die $tt->error;
171
172   open my $fh,  '>', "$current_dir/AUTHORS.txt" or die $!;
173   print $fh "$msg_format\n\n";
174   close $fh;
175   }
176
177################################################################
178
179sub cmd_make_licence {
180   my $meta = YAML::Syck::LoadFile("PROJECT-META.yml");
181
182   my $current_dir = Cwd::getcwd();
183
184   if (-f "$current_dir/LICENCE.txt") {
185      print "Warning: LICENCE.txt already exists\n";
186      return;
187      }
188
189   my $licence = $meta->{'public-dap'}{'data-licence'};
190
191   if (not -f "/usr/share/project-meta/licence.d/$licence.txt") {
192      print "Error: licence $licence doesn't exists in project-meta database\n";
193      exit 1;
194      }
195
196   copy("/usr/share/project-meta/licence.d/$licence.txt", "$current_dir/LICENCE.txt")
197      or die "Error: licence copy failed - $!";
198
199   print "Info: LICENCE.txt file create\n";
200   return;
201   }
202
203################################################################
204
205sub cmd_make_copyright {
206   my $meta = YAML::Syck::LoadFile("PROJECT-META.yml");
207
208   my $current_dir = Cwd::getcwd();
209
210   if (-f "$current_dir/COPYRIGHT.txt") {
211      # Test for manual or automatically generated file
212      # Automatically generated file by project-meta
213      my $automatic;
214      open my $fh, '<', "$current_dir/COPYRIGHT.txt" or die $!;
215      for my $line (<$fh>) {
216         $line =~ m/Automatically generated .* project-meta/i and $automatic++;
217         }
218      close $fh;
219
220      if (not $automatic) {
221         print "Warning: COPYRIGHT.txt already exists\n";
222         return;
223         }
224
225      print "Warning: update COPYRIGHT.txt\n";
226      }
227
228   my $tt = Template->new(INCLUDE_PATH => '/usr/share/project-meta/template.d');
229   my $msg_format = '';
230   $tt->process('COPYRIGHT.tt',
231      {
232         title       => $meta->{'project'}{'title'},
233         acronym     => $meta->{'project'}{'acronym'},
234         authorlist  => $meta->{'project'}{'authors'},
235         description => $meta->{'project'}{'short-description'},
236         licence     => $meta->{'public-dap'}{'data-licence'},
237         doi         => $meta->{'publication'}{'doi'},
238         urldoi      => $meta->{'publication'}{'url'},
239      }, \$msg_format) || die $tt->error;
240
241   open my $fh,  '>', "$current_dir/COPYRIGHT.txt" or die $!;
242   print $fh "$msg_format\n\n";
243   close $fh;
244   }
245
246################################################################
Note: See TracBrowser for help on using the repository browser.