Subject: Re: [bug#61207] [PATCH v2] gnu: Add opentaxsolver.

From: Skylar Hill <[email-masked]>
Date: Mon, 13 Feb 2023 03:26:19 +0000

Ahh okay had to disable the TLS guarantee on my Posteo account since
apparently debbugs doesn't provide a TLS connection, which is why it was
undeliverable. (Sorry for spamming you two but it should work this time.)

Here's my original message:

Thanks, y'all! I've attached a patch that addresses everything Nicolas
brought up. 

 I agree with Josselin. Licensing is unclear. Many files do not have
 a license, or are "user contributed" (under what terms?).

 Would it be possible to clarify this with upstream?

I got a hold of Aston Roberts <[email-masked]>, the maintainer
for OTS, and asked him about the licensing for files without
headers. (The tax templates, in particular, seem to lack headers because
the custom markup doesn't appear to have comment syntax.) He answered:

 Yes, all files of OTS are released under GNU GPL license.
 Will review the file headers.

So it looks like all the files, even the ones without a clear license
header, are GPL.

Skylar

>From f5f2b8b4539d48b474b131ece87b65dbfd9b2532 Mon Sep 17 00:00:00 2001
From: Skylar Hill <[email-masked]>
Date: Sun, 12 Feb 2023 20:47:23 -0600
Subject: [PATCH v3] gnu: Add opentaxsolver

---
 gnu/local.mk                                  |  1 +
 gnu/packages/finance.scm                      | 71 +++++++++++++++++++
 .../opentaxsolver-file-browser-fix.patch      | 58 +++++++++++++++
 3 files changed, 130 insertions(+)
 create mode 100644 gnu/packages/patches/opentaxsolver-file-browser-fix.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index cdb99813d0..148bd6e908 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1616,6 +1616,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/opensles-add-license-file.patch			\
   %D%/packages/patches/openssl-1.1-c-rehash-in.patch		\
   %D%/packages/patches/openssl-3.0-c-rehash-in.patch		\
+  %D%/packages/patches/opentaxsolver-file-browser-fix.patch     \
   %D%/packages/patches/open-zwave-hidapi.patch			\
   %D%/packages/patches/orpheus-cast-errors-and-includes.patch	\
   %D%/packages/patches/osip-CVE-2017-7853.patch			\
diff --git a/gnu/packages/finance.scm b/gnu/packages/finance.scm
index c9c8e9b823..252f5e422c 100644
--- a/gnu/packages/finance.scm
+++ b/gnu/packages/finance.scm
@@ -33,6 +33,7 @@
 ;;; Copyright © 2022 Collin J. Doering <[email-masked]>
 ;;; Copyright © 2022 Justin Veilleux <[email-masked]>
 ;;; Copyright © 2023 Frank Pursel <[email-masked]>
+;;; Copyright © 2023 Skylar Hill <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2271,3 +2272,73 @@ (define-public p2pool
 Monero node and what it mines, but you get frequent payouts like on a regular
 pool.")
     (license license:gpl3)))
+
+(define-public opentaxsolver
+  ;; The OTS version is formatted like tax-year_version. So, at time of
+  ;; writing, the version is 2022_20.00. Each part of this is used in
+  ;; different places in the source uri, so it's convenient to have them
+  ;; separately like this.
+  (let ((tax-year "2022")
+        (ots-version "20.00"))
+    (package
+      (name "opentaxsolver")
+      (version (string-append tax-year "_" ots-version))
+      (source (origin
+                (method url-fetch)
+                (uri (string-append "mirror://sourceforge/opentaxsolver/OTS_"
+                                    tax-year "/v" ots-version
+                                    "_linux/OpenTaxSolver" version "_linux64.tgz"))
+                (sha256
+                 (base32
+                  "06k0a72bmwdmr71dvrp8b4vl8vilnggsh92hrp7wjdgcjj9m074w"))
+                (patches (search-patches
+                          "opentaxsolver-file-browser-fix.patch"))))
+      (build-system glib-or-gtk-build-system)
+      (arguments
+       (list
+        #:phases
+        #~(modify-phases %standard-phases
+            (delete 'configure)
+            ;; OTS does provide a shellscript that does exactly
+            ;; this, but we need to do it ourselves to specify
+            ;; the correct compiler and to delete the GUI
+            ;; binaries.
+            (replace 'build
+              (lambda _
+                (delete-file "Run_taxsolve_GUI")
+                (delete-file-recursively "bin")
+                (mkdir "bin")
+                (chdir "src/Gui_gtk")
+                (invoke "make"
+                        (string-append "CC="
+                                       #$(cc-for-target)))
+                (chdir "..")
+                (invoke "make"
+                        (string-append "CC="
+                                       #$(cc-for-target)))))
+            ;; OTS doesn't provide a `make install` target,
+            ;; because it assumes it'll be run from the
+            ;; tarball. So, we do it ourselves, making sure to
+            ;; replicate the directory structure of the tarball.
+            (replace 'install
+              (lambda _
+                (copy-recursively "../bin"
+                                  (string-append #$output "/bin"))
+                (symlink (string-append #$output "/bin/ots_gui2")
+                         (string-append #$output "/bin/Run_taxsolve_GUI"))
+                (copy-recursively "../tax_form_files"
+                                  (string-append #$output
+                                                 "/tax_form_files"))
+                (copy-recursively "formdata"
+                                  (string-append #$output
+                                                 "/src/formdata")))))
+        #:tests? #f))
+      (inputs (list gtk+-2))
+      (native-inputs (list pkg-config))
+      (synopsis "Yearly tax preparation tool")
+      (description
+       "OpenTaxSolver is a program for calculating tax form entries for federal and
+state personal income taxes. It automatically fills out and prints your forms
+for mailing.")
 +      (home-page "https://opentaxsolver.sourceforge.net/")
+      (license license:gpl2+))))
diff --git a/gnu/packages/patches/opentaxsolver-file-browser-fix.patch b/gnu/packages/patches/opentaxsolver-file-browser-fix.patch
new file mode 100644
index 0000000000..0e6be74f85
--- /dev/null
+++ b/gnu/packages/patches/opentaxsolver-file-browser-fix.patch
@@ -0,0 +1,58 @@
+From 96fda11a53a89c6647031f2c05ef12f1a9df6a08 Mon Sep 17 00:00:00 2001
+From: Skylar Hill <[email-masked]>
+Date: Tue, 31 Jan 2023 21:02:18 -0600
+Subject: [PATCH] Change default directory in file browser
+
+---
+ src/Gui_gtk/ots_gui2.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/src/Gui_gtk/ots_gui2.c b/src/Gui_gtk/ots_gui2.c
+index ff3366b..1247933 100644
+--- a/src/Gui_gtk/ots_gui2.c
++++ b/src/Gui_gtk/ots_gui2.c
+@@ -82,6 +82,7 @@ char ots_release_package[]="20.00";
+ #include <string.h>
+ #include <stdlib.h>
+ #include <ctype.h>
++#include <unistd.h>
+ #include <sys/stat.h>
+ // #include "backcompat.c"
+ #include "gtk_utils.c"		/* Include the graphics library. */
+@@ -109,6 +110,7 @@ char toolpath[MaxFname]="", *start_cmd;
+ int pending_compute=0, supported_pdf_form=1;
+ int filingstatus_mfj=1;
+ int round_to_whole_nums=0;
++char *working_dir[MaxFname+512];
+ 
+ void pick_file( GtkWidget *wdg, void *data );	/* Prototype */
+ void consume_leading_trailing_whitespace( char *line );
+@@ -2364,7 +2366,7 @@ void save_taxfile( GtkWidget *wdg, void *data )
+  if (cpt != 0)
+   strcpy( cpt, "_xxxx.txt" );
+  // printf("OTS_save_taxfile: dir='%s', wc='%s', fname='%s'\n", directory_dat, wildcards_fb, filename_fb );
+- Browse_Files( "File to Save As:", 2048, directory_dat, wildcards_fb, filename_fb, Save_Tax_File );
++ Browse_Files( "File to Save As:", 2048, working_dir, wildcards_fb, filename_fb, Save_Tax_File );
+ }
+ 
+ 
+@@ -3878,7 +3880,7 @@ void pick_file( GtkWidget *wdg, void *data )
+   strcpy( wildcards_fb, ".txt" );
+   strcpy( filename_fb, "" );
+   // printf("OTS_pick_file: dir='%s', wc='%s', fname='%s'\n", directory_dat, wildcards_fb, filename_fb );
+-  Browse_Files( "Select File", 2048, directory_dat, wildcards_fb, filename_fb, receive_filename );
++  Browse_Files( "Select File", 2048, working_dir, wildcards_fb, filename_fb, receive_filename );
+ }
+ 
+ 
+@@ -4019,6 +4021,7 @@ int main(int argc, char *argv[] )
+  invocation_path[k] = '\0';
+  // printf("Invocation path = '%s'\n", invocation_path);
+  set_ots_path();
++ getcwd(working_dir, MaxFname+512);
+ 
+  /* Decode any command-line arguments. */
+  argn = 1;  k=1;
+-- 
+2.38.1
+