]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' of /home/jcharles/GIT/Lily/. into translation
authorJean-Charles Malahieude <lilyfan@orange.fr>
Sat, 16 Aug 2014 10:07:11 +0000 (12:07 +0200)
committerJean-Charles Malahieude <lilyfan@orange.fr>
Sat, 16 Aug 2014 10:07:11 +0000 (12:07 +0200)
17 files changed:
.gitignore
Documentation/contributor/issues.itexi
input/regression/parent-alignment-synchronized-with-self-alignment.ly [new file with mode: 0644]
input/regression/partial-in-mid-piece.ly [new file with mode: 0644]
input/regression/self-alignment-and-parent-alignment.ly [new file with mode: 0644]
lily/accidental-engraver.cc
lily/context-property.cc
lily/context.cc
lily/include/context.hh
lily/partial-iterator.cc
lily/property-iterator.cc
lily/score-scheme.cc
lily/self-alignment-interface.cc
scm/define-grob-properties.scm
scm/define-grobs.scm
scm/define-markup-commands.scm
scripts/auxiliar/make-countdown-announcement.sh

index 3097acfe263f48f2e926788eef9c521b6c51a789..7096f9b3b68a3c83869f865148a26ee82a22d276 100644 (file)
@@ -64,6 +64,7 @@ config.status.lineno
 configure
 gcstat*.scm
 lily-[0-9a-f][0-9a-f][0-9a-f]*
+lilypond-issues.csv
 lsr-unsafe.txt
 nohup.out
 out
index 7cf14faea891b27661316e93fd93285452e3b3d2..09b049f53c4cb928cf29e2d47eafe9b5cbce1b99 100644 (file)
@@ -891,8 +891,8 @@ deadline date, and optionally your name.  Follow the instructions
 provided:
 
 @example
-cd $LILYPOND_BUILD_DIR
-../scripts/auxiliar/make-countdown-announcement.sh "Jan 1, 2001" James
+cd $LILYPOND_GIT
+scripts/auxiliar/make-countdown-announcement.sh "Jan 1, 2001" James
 @end example
 
 The script produces an announcement that is easily readable in all
diff --git a/input/regression/parent-alignment-synchronized-with-self-alignment.ly b/input/regression/parent-alignment-synchronized-with-self-alignment.ly
new file mode 100644 (file)
index 0000000..50d21d8
--- /dev/null
@@ -0,0 +1,36 @@
+\version "2.19.11"
+
+\header {
+  texidoc = "When @code{parent-alignment-X} property is unset,
+the value of @code{self-alignment-X} will be used as the factor
+for parent alignment.  This happens e.g. for LyricTexts."
+}
+
+{
+  \time 4/2
+  % use breve noteheads because their refpoints aren't on their
+  % left edges - this may help catching subtle bugs.
+  \override NoteHead.style = #'altdefault
+  <>^"alignments “synchronized”:"
+  f'\breve f' f'
+  <>^"parent-alignment set to ##f:"
+  f' f' f'
+}
+\addlyrics {
+  \override LyricSpace.minimum-distance = 5
+
+  \override LyricText.self-alignment-X = #LEFT
+  left
+  \override LyricText.self-alignment-X = #CENTER
+  center
+  \override LyricText.self-alignment-X = #RIGHT
+  right
+
+  \override LyricText.parent-alignment-X = ##f
+  \override LyricText.self-alignment-X = #LEFT
+  left
+  \override LyricText.self-alignment-X = #CENTER
+  center
+  \override LyricText.self-alignment-X = #RIGHT
+  right
+}
diff --git a/input/regression/partial-in-mid-piece.ly b/input/regression/partial-in-mid-piece.ly
new file mode 100644 (file)
index 0000000..4c718a1
--- /dev/null
@@ -0,0 +1,32 @@
+\version "2.19.11"
+
+\header {
+  texidoc = "@code{\\partial} can be can be called in mid-piece in
+multiple contexts."
+}
+
+
+melodyOne = \relative {
+  \time 6/8
+  a'8 a a a a a |
+  \partial 8
+  d8 |
+  c8 c c c c c |
+}
+
+chordsOne = \chordmode {
+  \time 6/8
+  a2. |
+  \partial 8
+  s8 |
+  a2. |
+}
+
+\score {
+  <<
+    \set Score.barNumberVisibility = #all-bar-numbers-visible
+    \override Score.BarNumber.break-visibility = #all-visible
+    \new ChordNames { \chordsOne }
+    \new Staff { \melodyOne }
+  >>
+}
diff --git a/input/regression/self-alignment-and-parent-alignment.ly b/input/regression/self-alignment-and-parent-alignment.ly
new file mode 100644 (file)
index 0000000..9f26287
--- /dev/null
@@ -0,0 +1,49 @@
+\version "2.19.11"
+
+\header {
+  texidoc = "Grobs using @code{ly:self-alignment-interface::aligned-on-x-parent}
+and @code{ly:self-alignment-interface::aligned-on-y-parent}
+callbacks support separate alignments for self and parent."
+}
+
+{ f'1 f' f' }
+\addlyrics {
+  \override LyricSpace.minimum-distance = 5
+  \override LyricText.self-alignment-X = #LEFT
+  \override LyricText.parent-alignment-X = #LEFT
+  left-left
+  \override LyricText.self-alignment-X = #LEFT
+  \override LyricText.parent-alignment-X = #CENTER
+  left-center
+  \override LyricText.self-alignment-X = #LEFT
+  \override LyricText.parent-alignment-X = #RIGHT
+  left-right
+}
+
+{ f'1 f' f' }
+\addlyrics {
+  \override LyricSpace.minimum-distance = 5
+  \override LyricText.self-alignment-X = #CENTER
+  \override LyricText.parent-alignment-X = #LEFT
+  center-left
+  \override LyricText.self-alignment-X = #CENTER
+  \override LyricText.parent-alignment-X = #CENTER
+  center-center
+  \override LyricText.self-alignment-X = #CENTER
+  \override LyricText.parent-alignment-X = #RIGHT
+  center-right
+}
+
+{ f'1 f' f' }
+\addlyrics {
+  \override LyricSpace.minimum-distance = 5
+  \override LyricText.self-alignment-X = #RIGHT
+  \override LyricText.parent-alignment-X = #LEFT
+  right-left
+  \override LyricText.self-alignment-X = #RIGHT
+  \override LyricText.parent-alignment-X = #CENTER
+  right-center
+  \override LyricText.self-alignment-X = #RIGHT
+  \override LyricText.parent-alignment-X = #RIGHT
+  right-right
+}
index 5bc78357b25d861b50f73377909af0419aa5bde7..af6ce5ee8ee823f98846f6170436b649f2665986 100644 (file)
@@ -131,7 +131,7 @@ Accidental_engraver::update_local_key_signature (SCM new_sig)
   */
 
   SCM val;
-  while (trans && trans->where_defined (ly_symbol2scm ("localAlterations"), &val) == trans)
+  while (trans && trans->here_defined (ly_symbol2scm ("localAlterations"), &val))
     {
       trans->set_property ("localAlterations", ly_deep_copy (last_keysig_));
       trans = trans->get_parent_context ();
index fa77969e1c886f1a3c6a10593655f1d9563cd127..b578321a9370c79ea79b6bd8256e687140ab55a0 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "context.hh"
 #include "engraver.hh"
+#include "global-context.hh"
 #include "international.hh"
 #include "item.hh"
 #include "main.hh"
@@ -49,6 +50,17 @@ general_pushpop_property (Context *context,
                                    grob_property_path, new_value);
 }
 
+bool
+typecheck_grob (SCM symbol, SCM value)
+{
+  if (is_unpure_pure_container (value))
+    return typecheck_grob (symbol, unpure_pure_container_unpure_part (value))
+      && typecheck_grob (symbol, unpure_pure_container_pure_part (value));
+  return ly_is_procedure (value)
+    || is_simple_closure (value)
+    || type_check_assignment (symbol, value, ly_symbol2scm ("backend-type?"));
+}
+
 /*
   Grob descriptions (ie. alists with layout properties) are
   represented as a (ALIST . BASED-ON) pair, where BASED-ON is the
@@ -67,18 +79,23 @@ execute_override_property (Context *context,
 {
   SCM current_context_val = SCM_EOL;
 
-  Context *where = context->where_defined (context_property,
-                                           &current_context_val);
+  if (!context->here_defined (context_property, &current_context_val))
+    {
+      Context *g = context->get_global_context ();
+      if (!g)
+        return; // Context is probably dead
 
-  /*
-    Don't mess with MIDI.
-  */
-  if (!where)
-    return;
+      /*
+        Don't mess with MIDI.
+      */
+      if (g == context
+          || !g->here_defined (context_property, &current_context_val))
+        return;
 
-  if (where != context)
-    {
-      SCM base = updated_grob_properties (context, context_property);
+      /* where != context */
+
+      SCM base = updated_grob_properties (context->get_parent_context (),
+                                          context_property);
       current_context_val = scm_cons (base, base);
       context->set_property (context_property, current_context_val);
     }
@@ -106,24 +123,13 @@ execute_override_property (Context *context,
   */
   target_alist = scm_acons (symbol, new_value, target_alist);
 
-  bool ok = true;
-  bool pc = is_unpure_pure_container (new_value);
-  SCM vals[] = {pc ? unpure_pure_container_unpure_part (new_value) : new_value,
-                pc ? unpure_pure_container_pure_part (new_value) : SCM_BOOL_F
-               };
-
-  for (int i = 0; i < 2; i++)
-    if (!ly_is_procedure (vals[i])
-        && !is_simple_closure (vals[i]))
-      ok = ok && type_check_assignment (symbol, vals[i],
-                                        ly_symbol2scm ("backend-type?"));
 
   /*
     tack onto alist.  We can use set_car, since
     updated_grob_properties () in child contexts will check
     for changes in the car.
   */
-  if (ok)
+  if (typecheck_grob (symbol, new_value))
     {
       scm_set_car_x (current_context_val, target_alist);
     }
@@ -156,8 +162,7 @@ execute_revert_property (Context *context,
                          SCM grob_property_path)
 {
   SCM current_context_val = SCM_EOL;
-  if (context->where_defined (context_property, &current_context_val)
-      == context)
+  if (context->here_defined (context_property, &current_context_val))
     {
       SCM current_alist = scm_car (current_context_val);
       SCM daddy = scm_cdr (current_context_val);
index 7077014501a7651e76b5f8fe80bc2dea130dded2..718ef311225dfb0062e8e079990231496a49fbfd 100644 (file)
@@ -459,6 +459,19 @@ Context::where_defined (SCM sym, SCM *value) const
   return (daddy_context_) ? daddy_context_->where_defined (sym, value) : 0;
 }
 
+/* Quick variant of where_defined.  Checks only the context itself. */
+
+bool
+Context::here_defined (SCM sym, SCM *value) const
+{
+#ifndef NDEBUG
+  if (profile_property_accesses)
+    note_property_access (&context_property_lookup_table, sym);
+#endif
+
+  return properties_dict ()->try_retrieve (sym, value);
+}
+
 /*
   return SCM_EOL when not found.
 */
index d6cdfde6e4d7e35b934542dffc4c368fe0f23ffd..0595bf851389c655080c34e1199aaa1437bb02fa 100644 (file)
@@ -97,6 +97,7 @@ public:
   SCM internal_get_property (SCM name_sym) const;
   SCM properties_as_alist () const;
   Context *where_defined (SCM name_sym, SCM *value) const;
+  bool here_defined (SCM name_sym, SCM *value) const;
   void unset_property (SCM var_sym);
 
   void instrumented_set_property (SCM, SCM, const char *, int, const char *);
index 13223297f551c5fa972e1581d94d39595d59b387..723391020913a08dab5785a36ca4acde7759d83e 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "context.hh"
+#include "global-context.hh"
 #include "input.hh"
 #include "international.hh"
 #include "moment.hh"
@@ -28,6 +29,7 @@ class Partial_iterator : public Simple_music_iterator
 {
 public:
   DECLARE_SCHEME_CALLBACK (constructor, ());
+  DECLARE_SCHEME_CALLBACK (finalization, (SCM, SCM));
 protected:
   virtual void process (Moment);
 };
@@ -38,33 +40,41 @@ Partial_iterator::process (Moment m)
   if (Duration * dur
       = Duration::unsmob (get_music ()->get_property ("duration")))
     {
-      // Partial_iterator is an iterator rather than an engraver, so
-      // the active context it is getting called in does not depend on
-      // which context definition the engraver might be defined.
-      //
-      // Using where_defined to find the context where measurePosition
-      // should be overwritten does not actually work since the
-      // Timing_translator does not set measurePosition when
-      // initializing.
-
-      Context *timing = Context::unsmob (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
-                                                    get_outlet ()->self_scm (),
-                                                    ly_symbol2scm ("Timing")));
-
-      if (!timing)
-        programming_error ("missing Timing in \\partial");
+      Moment length = Moment (dur->get_length ());
+      if (get_outlet ()->now_mom () > 0)
+        {
+          Global_context *tg = get_outlet ()->get_global_context ();
+          tg->add_finalization (scm_list_3 (finalization_proc,
+                                            get_outlet ()->self_scm (),
+                                            length.smobbed_copy ()));
+        }
       else
         {
-          Moment mp = robust_scm2moment (timing->get_property ("measurePosition"),
-                                         Rational (0));
+          // Partial_iterator is an iterator rather than an engraver,
+          // so the active context it is getting called in does not
+          // depend on which context definition the engraver might be
+          // defined.
+          //
+          // Using where_defined to find the context where
+          // measurePosition should be overwritten does not actually
+          // work since the Timing_translator does not set
+          // measurePosition when initializing.
 
-          if (get_outlet ()->now_mom () > 0)
-            mp.main_part_ = measure_length (timing);
+          Context *timing = Context::unsmob
+            (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
+                         get_outlet ()->self_scm (),
+                         ly_symbol2scm ("Timing")));
+          if (!timing)
+            programming_error ("missing Timing in \\partial");
           else
-            mp.main_part_ = 0;
-
-          Moment length = Moment (dur->get_length ());
-          timing->set_property ("measurePosition", (mp - length).smobbed_copy ());
+            {
+              Moment mp = robust_scm2moment
+                (timing->get_property ("measurePosition"),
+                 Rational (0));
+              mp.main_part_ = 0;
+              timing->set_property
+                ("measurePosition", (mp - length).smobbed_copy ());
+            }
         }
     }
   else
@@ -74,3 +84,25 @@ Partial_iterator::process (Moment m)
 }
 
 IMPLEMENT_CTOR_CALLBACK (Partial_iterator);
+
+MAKE_SCHEME_CALLBACK (Partial_iterator, finalization, 2);
+SCM
+Partial_iterator::finalization (SCM ctx, SCM length)
+{
+  LY_ASSERT_SMOB (Context, ctx, 1);
+  LY_ASSERT_SMOB (Moment, length, 2);
+  Context *timing = Context::unsmob
+    (scm_call_2 (ly_lily_module_constant ("ly:context-find"),
+                 ctx,
+                 ly_symbol2scm ("Timing")));
+  if (!timing) {
+    programming_error ("missing Timing in \\partial");
+    return SCM_UNSPECIFIED;
+  }
+  Moment mp = robust_scm2moment (timing->get_property ("measurePosition"),
+                                 Rational (0));
+  mp.main_part_ = measure_length (timing);
+  timing->set_property ("measurePosition",
+                        (mp - *Moment::unsmob (length)).smobbed_copy ());
+  return SCM_UNSPECIFIED;
+}
index c7cb8108b0b214f8e2c5e1f4209c430c0f37f472..24f6383a7ad6e1964a86adc48d5daad1b8417a5f 100644 (file)
@@ -38,11 +38,9 @@ Property_iterator::process (Moment mom)
   bool once = to_boolean (m->get_property ("once"));
   SCM symbol = m->get_property ("symbol");
   SCM previous_value = SCM_UNDEFINED;
-  if (once) {
-    Context *w = o->where_defined (symbol, &previous_value);
-    if (o != w)
-      previous_value = SCM_UNDEFINED;
-  }
+  if (once)
+    o->here_defined (symbol, &previous_value);
+
   send_stream_event (o, "SetProperty", m->origin (),
                      ly_symbol2scm ("symbol"), symbol,
                      ly_symbol2scm ("value"), m->get_property ("value"));
@@ -68,11 +66,9 @@ Property_unset_iterator::process (Moment mom)
   bool once = to_boolean (m->get_property ("once"));
   SCM symbol = m->get_property ("symbol");
   SCM previous_value = SCM_UNDEFINED;
-  if (once) {
-    Context *w = o->where_defined (symbol, &previous_value);
-    if (o != w)
-      previous_value = SCM_UNDEFINED;
-  }
+  if (once)
+    o->here_defined (symbol, &previous_value);
+
   send_stream_event (o, "UnsetProperty", m->origin (),
                      ly_symbol2scm ("symbol"), symbol);
 
index fc6985e701f218ee9d13ce7fa582cc498dfad9e7..913cdc14c083d994784f8811f7f3e03cb257940d 100644 (file)
@@ -130,7 +130,12 @@ LY_DEFINE (ly_score_embedded_format, "ly:score-embedded-format",
   if (!score_def)
     return SCM_BOOL_F;
 
-  score_def = scale_output_def (score_def, output_scale (od));
+  /* Don't rescale if the layout has already been scaled */
+  if (to_boolean (score_def->c_variable ("cloned")))
+    score_def = score_def->clone ();
+  else
+    score_def = scale_output_def (score_def, output_scale (od));
+
   score_def->parent_ = od;
 
   SCM context = ly_run_translator (sc->get_music (), score_def->unprotect ());
index 27800679701299f0ec4f33eef5eee748a44ca3c9..9c73b6c7d8cf8cd6bf458b9648964150a28378b4 100644 (file)
@@ -122,30 +122,38 @@ Self_alignment_interface::aligned_on_parent (Grob *me, Axis a)
         he = him->extent (him, a);
     }
 
-  SCM sym = (a == X_AXIS) ? ly_symbol2scm ("self-alignment-X")
-            : ly_symbol2scm ("self-alignment-Y");
-  SCM align_prop (me->internal_get_property (sym));
+  SCM self_align = (a == X_AXIS)
+          ? me->internal_get_property (ly_symbol2scm ("self-alignment-X"))
+          : me->internal_get_property (ly_symbol2scm ("self-alignment-Y"));
 
-  if (!scm_is_number (align_prop))
-    return scm_from_int (0);
+  SCM par_align = (a == X_AXIS)
+          ? me->internal_get_property (ly_symbol2scm ("parent-alignment-X"))
+          : me->internal_get_property (ly_symbol2scm ("parent-alignment-Y"));
 
-  Real x = 0.0;
-  Real align = scm_to_double (align_prop);
+  if (par_align == SCM_EOL)
+      par_align = self_align;
 
+  Real x = 0.0;
   Interval ext (me->extent (me, a));
 
-  // Empty extent doesn't mean an error - we simply don't align such grobs.
-  // However, empty extent and non-empty stencil would be suspicious.
-  if (!ext.is_empty ())
-    x -= ext.linear_combination (align);
-  else if (me->get_stencil ())
-    warning (me->name () + " has empty extent and non-empty stencil.");
+  if (scm_is_number (self_align))
+    {
+      // Empty extent doesn't mean an error - we simply don't align such grobs.
+      // However, empty extent and non-empty stencil would be suspicious.
+      if (!ext.is_empty ())
+        x -= ext.linear_combination (scm_to_double (self_align));
+      else if (me->get_stencil ())
+        warning (me->name () + " has empty extent and non-empty stencil.");
+    }
 
-  // See comment above.
-  if (!he.is_empty ())
-    x += he.linear_combination (align);
-  else if (him->get_stencil ())
-    warning (him->name () + " has empty extent and non-empty stencil.");
+  if (scm_is_number (par_align))
+    {
+      // See comment above.
+      if (!he.is_empty ())
+        x += he.linear_combination (scm_to_double (par_align));
+      else if (him->get_stencil ())
+        warning (him->name () + " has empty extent and non-empty stencil.");
+    }
 
   return scm_from_double (x);
 }
@@ -173,6 +181,8 @@ ADD_INTERFACE (Self_alignment_interface,
                "@end table\n",
 
                /* properties */
+               "parent-alignment-X "
+               "parent-alignment-Y "
                "self-alignment-X "
                "self-alignment-Y "
                "X-align-on-main-noteheads "
index 05cff648d4bdcc06ca1d8fad9cf79d93b1f636ac..35f0074a88de07538712e29d39c651af28445cb2 100644 (file)
@@ -756,6 +756,15 @@ at a column with a negative penalty.")
      (page-turn-permission ,symbol? "Instructs the page breaker on
 whether to put a page turn at this column.  Can be @code{force} or
 @code{allow}.")
+     (parent-alignment-X ,number? "Specify on which point
+of the parent the object is aligned. The value @w{@code{-1}} means
+aligned on parent's left edge, @code{0}@tie{}on@tie{}center, and
+@code{1}@tie{}right edge, in X@tie{}direction.  Other numerical
+values may also be specified - the unit is half the parent's width.
+If unset, the value from @code{self-alignment-X} property will be
+used.")
+     (parent-alignment-Y ,number? "Like @code{parent-alignment-X}
+but for the Y@tie{}axis.")
      (parenthesized ,boolean? "Parenthesize this grob.")
      (positions ,number-pair? "Pair of staff coordinates
 @code{(@var{left} . @var{right})}, where both @var{left} and
@@ -817,7 +826,7 @@ influenced by changes to
      (self-alignment-X ,number? "Specify alignment of an object.  The
 value @w{@code{-1}} means left aligned, @code{0}@tie{}centered, and
 @code{1}@tie{}right-aligned in X@tie{}direction.  Other numerical
-values may also be specified.")
+values may also be specified - the unit is half the object width.")
      (self-alignment-Y ,number? "Like @code{self-alignment-X} but for
 the Y@tie{}axis.")
      (sharp-positions ,list? "Sharps in key signatures are placed
index 73588907e738c1f402346b5190f0141e74efe5c2..53401d3a42daf2362d464c7bd42ad11c260382e6 100644 (file)
@@ -79,6 +79,7 @@
         (font-size . -2)
         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
         (outside-staff-priority . 0)
+        (parent-alignment-X . ,CENTER)
         (script-priority . 0)
         (self-alignment-X . ,CENTER)
         (side-axis . ,Y)
                    X 'color))
         (font-shape . italic)
         (font-size . -4)
+        (parent-alignment-X . ,CENTER)
         (self-alignment-X . ,CENTER)
         (staff-padding . 0.7)
         (stencil . ,ly:text-interface::print)
         (font-series . bold)
         (outside-staff-priority . 450)
         (padding . 0.5)
+        (parent-alignment-X . #f)
         (script-priority . 200)
         (self-alignment-X . #f)
         (side-axis . ,Y)
         (font-encoding . fetaText)
         (font-size . -2)
         (padding . 0.2)
+        (parent-alignment-X . ,CENTER)
         (self-alignment-X . ,CENTER)
         (side-axis . ,Y)
         (staff-padding . 0.25)
         (font-encoding . fetaText)
         (font-series . bold)
         (font-shape . italic)
+        (parent-alignment-X . ,CENTER)
         (positioning-done . ,ly:script-interface::calc-positioning-done)
         (right-padding . 0.5)
         (self-alignment-X . ,CENTER)
         (font-encoding . fetaText)
         (font-size . -5)                ; don't overlap when next to heads.
         (padding . 0.5)
+        (parent-alignment-X . ,CENTER)
+        (parent-alignment-Y . ,CENTER)
         (positioning-done . ,ly:script-interface::calc-positioning-done)
         (script-priority . 100)
         (self-alignment-X . ,CENTER)
     (GridLine
      . (
         (layer . 0)
+        (parent-alignment-X . ,CENTER)
         (self-alignment-X . ,CENTER)
         (stencil . ,ly:grid-line-interface::print)
         (X-extent . ,ly:grid-line-interface::width)
         (extra-spacing-height . (0.2 . -0.2))
         (font-series . medium)
         (font-size . 1.0)
+        (parent-alignment-X . ())
         (self-alignment-X . ,CENTER)
         (stencil . ,lyric-text::print)
         (text . ,(grob::calc-property-by-copy 'text))
         (direction . ,UP)
         (font-encoding . fetaText)
         (padding . 0.4)
+        (parent-alignment-X . ,CENTER)
         (self-alignment-X . ,CENTER)
         (side-axis . ,Y)
         (springs-and-rods . ,ly:multi-measure-rest::set-text-rods)
         (direction . ,UP)
         (outside-staff-priority . 450)
         (padding . 0.2)
+        (parent-alignment-X . ,CENTER)
         (self-alignment-X . ,CENTER)
         (skyline-horizontal-padding . 0.2)
         (staff-padding . 0.25)
         (font-encoding . fetaText)
         (font-size . -2)
         (padding . 0.2)
+        (parent-alignment-X . ,CENTER)
         (self-alignment-X . ,CENTER)
         (staff-padding . 0.25)
         (stencil . ,ly:text-interface::print)
         (beam-thickness . 0.48) ; staff-space
         (beam-width . ,ly:stem-tremolo::calc-width) ; staff-space
         (direction . ,ly:stem-tremolo::calc-direction)
+        (parent-alignment-X . ,CENTER)
         (slope . ,ly:stem-tremolo::calc-slope)
         (stencil . ,ly:stem-tremolo::print)
         (style . ,ly:stem-tremolo::calc-style)
         (font-encoding . fetaText)
         (font-size . -5)                ; don't overlap when next to heads.
         (padding . 0.5)
+        (parent-alignment-X . ,CENTER)
         (script-priority . 100)
         (self-alignment-X . ,CENTER)
         (self-alignment-Y . ,CENTER)
         (font-shape . italic)
         (font-size . -4)                ; don't overlap when next to heads.
         (padding . 0.5)
+        (parent-alignment-X . ,CENTER)
         (script-priority . 100)
         (self-alignment-X . ,CENTER)
         (self-alignment-Y . ,CENTER)
         ;; sync with Fingering ?
         (padding . 0.3)
 
+        (parent-alignment-X . #f)
         (script-priority . 200)
         ;; self-alignment cannot be LEFT because of fingering diagrams.
         (self-alignment-X . #f)
index 3fc1e573bfb3baea5838f387b15720ecd43cfba8..e0b8982ea25f10a731f7c9638728bf489f80104f 100644 (file)
@@ -3880,7 +3880,7 @@ an inverted glyph.  Note that within music, one would usually use the
 @code{\\fermata} articulation instead of a markup.
 
 @lilypond[verbatim,quote]
- { c1^\\markup \\fermata d1_\\markup \\fermata }
+ { c''1^\\markup \\fermata d''1_\\markup \\fermata }
 
 \\markup { \\fermata \\override #`(direction . ,DOWN) \\fermata }
 @end lilypond
index fe1747f731397c68172f5419e5ea278c9d30c9a7..463998766524eb0feadfe789fb18c88bfabda4b1 100755 (executable)
 
 CSV_FILE=lilypond-issues.csv # comma-separated values
 TSV_FILE=lilypond-issues.tsv # tab-separated values
-URL_BASE="http://code.google.com/p/lilypond/issues"
+URL_BASE="https://code.google.com/p/lilypond/issues"
 QUERY_STR="q=Patch%3Apush%2Ccountdown%2Creview%2Cnew%2Cwaiting&colspec=Patch%20Owner%20ID%20Summary&sort=patch"
 DEADLINE=$1
-PATCH_MEISTER=${2:-"The Patch Mister"}
+PATCH_MEISTER=${2:-"The Patch Meister"}
 MAILMAP='
 "adam.spiers","Adam Spiers"
 "aleksandr.andreev","Aleksandr Andreev"
@@ -40,6 +40,7 @@ MAILMAP='
 "graham@percival-music.ca","Graham Percival"
 "hanwenn","Han-Wen Nienhuys"
 "hjunes","Heikki Junes"
+"ht.lilypond.development","Heikki Tauriainen"
 "ianhulin44","Ian Hulin"
 "idragosani","Brett McCoy"
 "jameselihubailey","James E. Bailey"
@@ -161,6 +162,7 @@ fi
 sed '{
 1d
 /^$/d
+s/\t/ /g
 s/^"//
 s/","/\t/g
 s/",*$//
@@ -168,6 +170,25 @@ s/""/"/g
 }' $CSV_FILE | cut -sf1-4 > $TSV_FILE
 
 
+ISSUES_WITH_MISSING_FIELDS=`sed -n '/\t\t\|\t$/p' $TSV_FILE |
+                            awk -F"\t" '{ print $3 }'`
+
+if [ "$ISSUES_WITH_MISSING_FIELDS" ]; then
+  COUNT=`wc --lines <(echo "$ISSUES_WITH_MISSING_FIELDS") | sed 's/ .*//'`
+  LINKS_WITH_MISSING_FIELDS=`echo "$ISSUES_WITH_MISSING_FIELDS" |
+                             sed "s!^!  $URL_BASE/detail?id=!"`
+  if [ $COUNT -eq 1 ]; then
+    echo -e "\nError: The following issue is missing an OWNER or SUMMARY:" >&2
+  else
+    echo -e "\nError: Each of the following issues is missing an OWNER or SUMMARY:" >&2
+  fi
+  echo "$LINKS_WITH_MISSING_FIELDS" >&2
+  echo "Please add the missing information in the tracker and start over." >&2
+  remove-if-exists $TSV_FILE
+  exit 1
+fi
+
+
 EMAILS_USED=`awk -F"\t" '{ print $2 }' $TSV_FILE | sort --unique`
 KNOWN_EMAILS=`
 IFS=$'\n'